我有一个类,我们称之为ConstVector,它只定义了cbegin/cend而不是开始/结束,因为我不想在构造之后允许修改其成员。我试图用基于for循环这样的范围内:对于基于循环的范围,cbegin/cend不够吗?
ConstVector const_vector(1, 2, 3);
for(const auto &x : const_vector)
....
虽然类的相关部分如下:
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();
}
但我的编译器抱怨:
‘begin’ was not declared in this scope
我问题是:我是否必须实施开始/结束?据我了解,它应该选择cbegin/cend,如果它是const auto &x
而不是auto &x
。至少这对我来说是有意义的。如果我删除基于循环的范围,一切都编译好。
我也尝试几乎所有建议here使它const
,但没有帮助。
请参阅[什么是暴露自定义STL样式迭代的首选方法?](https://stackoverflow.com/questions/39231664/what-is-the-preferred-way-to-expose-custom- stl-style-iteration) –
[我应该何时使用新的ranged-for,并且可以将它与新的cbegin/cend结合?](https://stackoverflow.com/questions/5814553/when-should-我使用的最新远程换和可-I-结合,它与 - 的 - 新的cbegin-CE) –