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

您只需有一个用于读取和写入的重载:

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 回答