2017-04-03 6 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); 
} 

、私はそのようなstd::transformstd::copyとしてSTLアルゴリズムのためbegin()end()を使用しようとしています。 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

STLアルゴリズムに完全に準拠するためにconst実装と非const実装の両方を提供する必要がありますか、それともクラスのアプリケーションに依存しますか? – Skipher

+0

はい、一般的に両方を提供する必要があります。 – CompuChip

+2

@Skipherイテレータを使用してコンテナ内のデータを変更できるようにするには、非constバージョンのみが必要です。 – juanchopanza

4

ここで重要な言葉は「CONST」です:あなたはconst double*を返すあなたのbegin()end()機能の追加constバージョンを提供する必要があります。

C++ 11を使用している場合は、cbegin()cend()を指定することもできます。

関連する問題