2017-06-02 4 views
8

Mam klasę, nazwijmy to ConstVector, która definiuje tylko cbegin/cend, a nie początek/koniec, ponieważ nie chcę pozwolić na modyfikacje jej członków po zakończeniu budowy. Próbowałem użyć zakres oparty na pętli tak:Czy cbegin/cend nie jest wystarczający dla zakresu opartego na pętli?

ConstVector const_vector(1, 2, 3); 
for(const auto &x : const_vector) 
.... 

Chociaż odpowiednia część klasy wygląda następująco:

template<class T> 
class ConstVector 
{ 
    public: 
     ConstVector(std::initializer_list<T> values); 
     typename std::vector<T>::const_iterator cbegin(void) const; 
     typename std::vector<T>::const_iterator cend(void) const; 

    private: 
     std::vector<T> data; 
}; 

template<class T> 
ConstVector::ConstVector(std::initializer_list<T> values) 
    : data(values) 
{ 
} 

template<class T> 
typename std::vector<T>::const_iterator ConstVector<T>::cbegin() const 
{ 
    return this->data.cbegin(); 
} 

template<class T> 
typename std::vector<T>::const_iterator ConstVector<T>::cend() const 
{ 
    return this->data.cend(); 
} 

Ale mój kompilator narzeka:

‘begin’ was not declared in this scope 

My Pytanie brzmi: Czy muszę zaimplementować początek/koniec? O ile to zrozumiałem, powinien wybrać cbegin/cend, jeśli jest to const auto &x, a nie auto &x. Przynajmniej to ma dla mnie sens. Jeśli usunę moją pętlę z zasięgiem, wszystko się skompiluje.

Próbowałem też prawie wszystko, co sugerowałam here, aby zrobić to const, ale to nie pomogło.

+0

Zobacz [jaki jest preferowany sposób na ujawnienie niestandardowej iteracji stylu STL?] (Https://stackoverflow.com/questions/39231664/what-is-the-preferred-way-to-ex-ustom-custom- stl-style-iteration) –

+0

Możliwy duplikat [Kiedy powinienem użyć nowego zakresu i czy mogę go połączyć z nowym cbegin/cend?] (https://stackoverflow.com/questions/5814553/when-should- i-używaj-nowego-zakresu-do-i-może-łączyć-z-nowym-cbegin-ce) –

Odpowiedz

8

Czy muszę zaimplementować początek/koniec?

Tak.

O ile dobrze zrozumiałem, należy wybrać cbegin/cend czy to const auto &x i nie auto &x.

W ten sposób nie zdefiniowano standardu w oparciu o zakresy for. Oparte na zakresie for zawsze szuka begin() i end(). Od https://timsong-cpp.github.io/cppwp/n3337/stmt.ranged.

inaczej rozpocząć lista_wyrażeń_sortowania i końcową lista_wyrażeń_sortowaniabegin(__range) i end(__range), odpowiednio, gdzie begin i end są wyszukiwane z odnośnika argumentu zależne ([basic.lookup.argdep)]. Do celów tego wyszukiwania nazw przestrzeń nazw przestrzeń nazw jest skojarzoną przestrzenią nazw.

Powiązane problemy