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.
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) –
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) –