我有一个类,我们称之为ConstVector,它只定义cbegin/cend而不是begin/end,因为我不想在构造之后允许对其成员进行修改.我尝试使用基于for循环的范围,如下所示:
ConstVector const_vector(1, 2, 3);
for(const auto &x : const_vector)
....
Run Code Online (Sandbox Code Playgroud)
虽然该课程的相关部分如下所示:
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();
}
Run Code Online (Sandbox Code Playgroud)
但我的编译器抱怨:
‘begin’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
我的问题是:我必须实现开始/结束吗?据我所知,它应该选择cbegin/cend,如果它const auto &x不是auto &x.至少这对我来说是有意义的.如果我删除基于for循环的范围,一切都编译得很好.
我也尝试过这里提出的所有内容const,但这并没有帮助.
我必须实现开始/结束吗?
是.
据我所知,它应该选择
cbegin/cend是否const auto &x存在auto &x.
这不是for标准中基于范围的定义.基于范围for总是寻找begin()和end().来自https://timsong-cpp.github.io/cppwp/n3337/stmt.ranged.
否则,开始-EXPR和最终EXPR是
begin(__range)和end(__range)表示,其中begin和end被查找与参数相关的查找([basic.lookup.argdep]).出于此名称查找的目的,名称空间std是关联的名称空间.
| 归档时间: |
|
| 查看次数: |
674 次 |
| 最近记录: |