5

一般に、読み取りアクセスと書き込みアクセスの両方に対して、クラスのインデックス[ ]演算子をどのように宣言しますか?

私は何かを試しました

/**
 * 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)'
4

3 に答える 3

15

あなたの可変バージョンは問題ありません:

T& operator[](T u);

ただし、constバージョンはメンバー関数であり、参照constを返す必要があります。const

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

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

于 2012-12-03T15:58:15.027 に答える
8

読み取りと書き込みの両方に使用される 1 つのオーバーロードがあるだけです。

T& operator[](int);

そうは言っても、constオーバーロードが必要になる場合もあります。

const T& operator[](int) const;

constこれにより、クラスのインスタンスへの読み取り専用インデックスが提供されます。

于 2012-12-03T15:57:30.457 に答える
3

オーバーロードされた関数は戻り値の型だけが異なるわけではないため、エラーが発生します。しかし、それらは const-ness によって異なる場合があります。

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

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

「書き込み」と「読み取り」の場所が入れ替わっていることに注意してください。

また、実際には、演算子の引数が整数型であることを意味していませんか?

于 2012-12-03T16:01:27.697 に答える