2017-04-03 38 views
2

我有一个类,其数据容器由一个数组支持,我对begin()end()有以下实现。STL算法的begin()和end()

template <size_t size> 
double * MyContainerClass<size>::begin(){ 
    return std::begin(mContainer); 
} 

template <size_t size> 
double * MyContainerClass<size>::end(){ 
    return std::end(mContainer); 
} 

在其它成员函数,我试图使用begin()end()为STL算法如std::transformstd::copy。当const对象作为参数传递给这些成员函数过去了,我遇到的错误:

error: passing ' const MyContainerClass<size> ' as ' this ' argument discards qualifiers.
note: in call to ' double* MyContainerClass<size>::begin() [with unsigned int size = size ]'

这是不正确引起的begin()end()实现?

std::copy(begin(), end(), someOutputIterator); 

回答

4

Is this caused by incorrect begin() and end() implementations?

是的,你需要const版本的功能。例如:

template <size_t size> 
const double * MyContainerClass<size>::begin() const { 
    return std::begin(mContainer); 
} 
+0

我是否需要提供const和非const实现以完全符合STL算法,还是依赖于我的类的应用程序? – Skipher

+0

是的,你应该一般都提供。 – CompuChip

+2

@Skipher如果要允许通过迭代器修改容器中的数据,则只需要非const版本。 – juanchopanza

4

这里最重要的词是“常量”:您需要提供额外的const版本的您begin()end()功能,即返回const double*

如果您使用的是C++ 11,那么您可能还需要提供cbegin()cend()