迭代器没有匹配的构造函数

时间:2016-03-24 10:33:48

标签: c++ templates

template<class T>
class Vector {
    size_t size;
    size_t allocated;
    T *array;
public:
    Vector() {...};
    Vector(size_t constr_size) {...};
    Vector(const Vector &source) {...};
    ~Vector() {
        delete array;
    };

   /*omitted methods*/

    class iterator : public std::iterator<std::input_iterator_tag, int> {
            Vector<T> *vector;
            size_t position;

        public:
            iterator(Vector<T> *vector_, size_t idx) {
                vector = vector_;
                position = idx;
            };

            iterator(iterator &it) {
                vector = it.vector;
                position = it.position;
            };

            /*more omitted methods*/
    };
    Vector<T>::iterator begin() {
        return Vector<T>::iterator(this, 0);
    };
    Vector<T>::iterator end() {
        return Vector<T>::iterator(this, size);
    };
};

当我尝试创建一个Vector并使用迭代器时,我得到一个错误没有用于初始化'Vector :: iterator'的匹配构造函数。为什么会这样?似乎所有必填字段都已定义,但不知何故我收到错误。

1 个答案:

答案 0 :(得分:5)

Vector<T>::iterator begin() {
    return Vector<T>::iterator(this, 0);
};

由于您在此处按值返回,因此将调用iterator的复制构造函数。看起来像这样:

iterator(iterator &it);

请注意,您尝试使用临时(Vector<T>::iterator(this,0))复制构造,但复制构造函数通过非const引用获取其参数。您不能将临时绑定到非const引用,因此错误。

简单的解决方法是使复制构造函数采用const引用:

iterator(const iterator &it);