我正在尝试为类分配重载许多运算符,并且需要获取<<和++运算符一起工作。下面是我正在处理的代码示例。如果您有任何想法,请告诉我。
删除通用模板
template (class T)
class Vector
{
public:
class VectIter
{
friend class Vector;
private:
Vector<T> *v; // points to a vector object of type T
int index; // represents the subscript number of the vector's
// array.
public:
VectIter(Vector<T>& x);
T operator++();
T operator++(int);
T operator--();
T operator--(int);
T operator *();
friend ostream& operator <<(ostream& out, const VectIter& rhs)
{
out << (*rhs) <<endl;
return out;
}
};
Vector(int sz);
~Vector();
T & operator[](int i);
void ascending_sort();
private:
T *array; // points to the first element of an array of T
int size;
void swap(T&, T&);
};
以下是main中出现错误的地方:
Vector<Mystring> y(3);
y[0] = "Bar";
y[1] = "Foo";
y[2] = "All";;
Vector<Mystring>::VectIter iters(y);
cout << "\n\nTesting Postfix --";
for (int i=0; i<3 ; i++)
cout << endl << (iters++);
以下是我正在使用的运营商的示例:
T Vector<T>::VectIter::operator ++()
{
if(index == (*v).size)
index = 0;
else
index++;
return (*v).array[index];
}
T Vector<T>::VectIter::operator ++(int post)
{
post = index;
if(index == (*v).size)
index = 0;
else
index++;
return (*v).array[post];
}
这段代码似乎适用于int变量,但是当我将它更改为我的自定义类Mystring时,我得到了错误。
答案 0 :(得分:2)
你的迭代器operator++
返回一个T
而不是一个迭代器,所以你的迭代器的operator<<
没有被调用。很可能Mystring
没有operator<<
声明/定义OR Mystring
operator<<
将非const引用作为其第二个参数,并且不能接受临时从您的operator++
返回。
编辑:鉴于您对OP的更新(适用于int
),您几乎肯定需要为operator<<
课程实施Mystring
。
答案 1 :(得分:1)
嗯......你定义的迭代器与通常定义的迭代器有很大的不同。迭代器(至少在C ++中)通常大致类似于指针:当你递增或递减它时,结果是迭代器,而不是迭代器引用的任何类型。您必须取消引用迭代器才能获得引用的类型。
您看到的错误看起来像是因为虽然您声明了 ++
和--
运算符,但您还没有定义它们 - - 所以当你尝试使用它们时,你的代码将不再编译/链接。
答案 2 :(得分:0)
您的Mystring
班级是否有&lt;&lt;运营商定义?你的迭代器最终会暴露出一个Mystring对象,它的运算符&lt;&lt;(&)将被一个ostream调用;您可能会收到此错误,因为它未定义。