2016-03-24 28 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); 
    }; 
}; 

Bir Vector oluşturmaya ve yineleyicilerle çalışmaya çalıştığımda bir hata alıyorum 'Vector :: iterator' başlatılması için eşleşen bir kurucu yok. Neden oluyor? Gerekli tüm alanlar tanımlanmış gibi görünüyor, ancak bir şekilde bir hata alıyorum. Burada değeriyle dönmek yanaYineleyici için eşleşen kurucu yok

cevap

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

, iterator için kopya yapıcısı çağrılır. Eğer çalıştığınız

iterator(iterator &it); 

Not geçici (Vector<T>::iterator(this,0)) kullanarak kopya oluşturmak, ancak kopya yapıcı const olmayan referans olarak argüman alır: İşte buna benzer. Yapılandırılmamış bir referansa geçici olarak bağlanamazsınız, dolayısıyla hata. Doğru, const referanslar almalıdır

iterator(const iterator &it); 
+0

Anlıyorum gibi, genel kopyalama kurucularınızdaki:

basit bir düzeltme kopya yapıcı bir sabit başvuru almak yapmaktır? – RomaValcer

+0

@RomaValcer Onlar * gerekmez *, ancak genellikle gerekir. – TartanLlama

İlgili konular