2017-06-02 84 views
8

我有一个类,我们称之为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,但没有帮助。

+0

请参阅[什么是暴露自定义STL样式迭代的首选方法?](https://stackoverflow.com/questions/39231664/what-is-the-preferred-way-to-expose-custom- stl-style-iteration) –

+0

[我应该何时使用新的ranged-for,并且可以将它与新的cbegin/cend结合?](https://stackoverflow.com/questions/5814553/when-should-我使用的最新远程换和可-I-结合,它与 - 的 - 新的cbegin-CE) –

回答

8

我必须执行开始/结束吗?

是的。

据我的理解是,它应该选择cbegin/cend如果它const auto &x,而不是auto &x

这不是如何在标准中定义基于范围的for。基于范围的for总是寻找begin()end()。从https://timsong-cpp.github.io/cppwp/n3337/stmt.ranged

否则,开始-EXPR最终EXPRbegin(__range)end(__range),分别,其中beginend中查找与参数相关的查找([basic.lookup.argdep])。为了查找这个名称,namespace std是一个关联的名称空间。

相关问题