【发布时间】:2017-06-02 15:06:19
【问题描述】:
我有一个类,我们称之为 ConstVector,它只定义 cbegin/cend 而不是 begin/end,因为我不想在构造后允许对其成员进行修改。我尝试使用基于范围的 for 循环,如下所示:
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
我的问题是:我必须实现开始/结束吗?据我了解,如果它是const auto &x 而不是auto &x,它应该选择cbegin/cend。至少这对我来说是有意义的。如果我删除基于 for 循环的范围,一切都可以正常编译。
我也尝试了几乎所有建议 here 以使其成为 const,但这并没有帮助。
【问题讨论】:
标签: c++