2012-12-03 14 views
5

一般的に、インデックスの読み取りと書き込みアクセスの両方について、クラスの演算子[ ]を宣言しますか?C++:[]演算子の読み込みアクセスと書き込みアクセスのオーバーロード

私はあなたが簡単に読み取りと書き込みの両方に使用されます1つのオーバーロード持って私にエラーを与える

/** 
* Read index operator. 
*/ 
T& operator[](T u); 

/** 
* Write index operator 
*/ 
const T& operator[](T u); 

のようなもの

../src/Class.h:44:14: error: 'const T& Class::operator[](T)' cannot be overloaded 
../src/Class.h:39:8: error: with 'T& Class::operator[](T)' 

答えて

14

あなたの変更可能なバージョンは大丈夫です

const T& operator[](T u) const; 
         ^^^^^ 

これは、他と区別するためだけでなく、オーバーロードするだけでなく、クラスのインスタンスconstへの(読み取り専用)アクセスを許可します。一般に、オーバーロードされたメンバ関数は、そのパラメータ型とconst/volatile修飾子によって区別されますが、ではなく戻り値の型によってになります。

6

を試してみました:

T& operator[](int); 

をあなたはまた、const過負荷を持っていることを望むかもしれません:

const T& operator[](int) const; 

これは、クラスのインスタンスに読み取り専用のインデックスを作成します。

T& operator[](T u); 

しかしconstバージョンはconstメンバ関数と同様にconst参照を返すようになります:

+0

さらに詳しい説明を追加すると、これは、演算子のオーバーロードによってオブジェクトへの参照が返されるためです。これにより、それに割り当てるだけでなく読み込むことができるため、1つの過負荷の必要があります。 – Chris

2

オーバーロードされた関数は戻り値の型によってのみ異なるので、エラーが発生します。しかし、それらは構造によって異なる可能性があります。

/** 
* Write index operator. 
*/ 
T& operator[](T u); 

/** 
* Read index operator 
*/ 
const T& operator[](T u) const; 

「書き込む」と「読み込む」スワップされた場所に注意してください。

また、実際には、整数型の演算子の引数を意味しませんか?