2016-03-24 22 views
1
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); 
    }; 
}; 

ベクターを作成してイテレータで処理しようとすると、「ベクター::イテレータ」の初期化に一致するコンストラクタがありません。それはなぜ起こるのですか?すべての必須フィールドが定義されているようですが、何とかエラーが発生します。イテレータに一致するコンストラクタがありません

答えて

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

ここで値を返すので、iteratorのコピーコンストラクタが呼び出されます。コピー・構築するために(Vector<T>::iterator(this,0))一時的に使用しようとしているが、コピーコンストラクタは、非const参照によってその引数を取る

iterator(iterator &it); 

注:それはこのようになります。一時参照を非const参照にバインドすることはできないため、エラーになります。右、constの参照を取る必要があります

iterator(const iterator &it); 
+0

私は理解しているように、一般的なコピーコンストラクタで:

簡単な修正は、コピーコンストラクタはconst参照を取るようにすることですか? – RomaValcer

+0

@RomaValcer彼らは*必要なものではありませんが、一般的にそれらは必要です。 – TartanLlama

関連する問題