获取错误:当同时使用operator ++时,不匹配运算符<<

时间:2011-03-28 02:25:49

标签: c++

我正在尝试为类分配重载许多运算符,并且需要获取<<和++运算符一起工作。下面是我正在处理的代码示例。如果您有任何想法,请告诉我。

删除通用模板

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时,我得到了错误。

3 个答案:

答案 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调用;您可能会收到此错误,因为它未定义。