我必须重载插入操作符才能以矩阵格式查看我的类对象。我写了代码,但有些不对劲。当我将其包含在我的代码中并尝试构建时,编译器会给我带来大量错误;当我评论那部分时,错误消失了,程序正常工作。这是代码:
template <class itemType>
ostream & operator<< (ostream & os, const Storage2D<itemType> & rhs)
{
node<itemType>* ptrRow = rhs.head;
node<itemType>* ptrColumn = rhs.head;
for(; ptrColumn->down != NULL; ptrColumn = ptrColumn->down)
{
ptrRow = ptrColumn;
for(; ptrRow->right != NULL; ptrRow = ptrRow->right)
{
os << ptrRow->info << setw(10);
}
os << ptrRow->info << setw(10) << endl;
}
return os;
}
以下是我尝试使用main函数重载的方法:
Storage2D<double> m(row, column);
cout << m;
它不是类Storage2D的成员函数,它是在实现文件中写入Storage2D类的范围之外的。
如果你提前帮助我会很棒。
编辑:这是我的其余代码。 Storage2D.h文件:
template <class itemType>
struct node
{
itemType info;
node* right;
node* down;
node()
{}
node(itemType data, node* r = NULL, node* d = NULL)
{
info = data;
right = r;
down = d;
}
};
template <class itemType>
class Storage2D
{
public:
Storage2D(const int & , const int & ); //constructor
//~Storage2D(); //destructor
//Storage2D(const Storage2D & ); //deep copy constructor
private:
node<itemType>* head;
};
ostream& operator<< (ostream & os, const Storage2D & rhs);
#include "Storage2D.cpp"
答案 0 :(得分:2)
head
是私有的,因此运营商需要成为朋友才能访问该数据成员。它还需要声明为函数模板,因为Storage2D是一个类模板:
#include <iostream> // for std::ostream
template <class itemType>
class storage2D {
// as before
template <typename T>
friend std::ostream& operator<< (std::ostream & os, const Storage2D<T> & rhs);
};
// declaration
template <typename T>
std::ostream& operator<< (std::ostream & os, const Storage2D<T> & rhs);
请注意,我已明确使用std::ostream
,因为ostream
位于std
命名空间中。