C ++错误:operator []无法重载

时间:2015-07-27 16:00:14

标签: c++ templates overloading

我正在学习C ++并学习Vandevoorde和Josuttis的C ++模板的第18章。我重新输入了表达式模板的代码,但以下是产生错误

sarray1.cpp:36:6: error: ‘T& SArray<T>::operator[](size_t) const’ cannot be overloaded
   T& operator[] (size_t idx) const {
      ^
sarray1.cpp:32:5: error: with ‘T SArray<T>::operator[](size_t) const’
   T operator[] (size_t idx) const {

以下是代码:

template <typename T>
class SArray {

public:

...

  T operator[] (size_t idx) const {
    return storage[idx];
  }

  T& operator[] (size_t idx) const {
    return storage[idx];
  }
...
};

我只是在学习C ++,所以我没有看到一个重载函数的实例,它只是返回类型,但我看到确实已经完成了:Overload a C++ function according to the return value。我还看到[]不在C ++中的list of operators that cannot be overloaded上。我无法想到还有什么可能出错。上述错误的原因是什么?

3 个答案:

答案 0 :(得分:4)

在重新输入第323页的代码时出错。只有第一次重载应为const,而第二次重载应为非const

T operator[] (size_t idx) const {
    return storage[idx];
}

T& operator[] (size_t idx) { // <<== No const here
    return storage[idx];
}

此代码试图说明的一点是,您可以在const - this对象的SArray上重载运算符。 C ++将从上下文中找出它应调用的两个运算符中的哪一个,然后在const为非const时返回引用,或者在数组为@GET @Produces({ MediaType.TEXT_HTML, MediaType.TEXT_PLAIN }) public String default() { return "Hello Rest Api"; } 时返回副本。

答案 1 :(得分:1)

严格来说,你不能在返回类型上重载。如果您阅读了链接的问题和答案(Overload a C++ function according to the return value),您会看到需要解决方法。

但是,你真的要问你在做什么?有更简单的解决方案吗?

您可能应该有一个const方法和一个非const方法:

const T& operator[] (size_t idx) const {
  return storage[idx];
}

T& operator[] (size_t idx)  {
  return storage[idx];
}

答案 2 :(得分:1)

您不能通过C ++中的返回类型重载。我们考虑的是参数,对于成员函数,还要考虑资格。在这种情况下,我猜测你的意图是:

// a non-const member function to return a non-const reference
T& operator[] (size_t idx) {
    return storage[idx];
}

// a const member function to return a const reference
const T& operator[] (size_t idx) const {
    return storage[idx];
}

这样,如果const是指向this的指针(因为非const函数不可行),则会调用const成员函数。 - 否则将调用const函数(因为它将是更好的匹配)。