【问题标题】:C++ error: operator[] cannot be overloadedC++ 错误:operator[] 不能被重载
【发布时间】:2015-07-27 16:00:14
【问题描述】:

我正在学习 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 上。我想不出还有什么问题。出现上述错误的原因是什么?

【问题讨论】:

  • 不确定,但似乎相关:Const and Non-Const Operator Overloading 如果T&amp; 版本上的const 是错误的?
  • 是的,第二行的 const 是一个错误,如下面的答案之一所示。但是,我将保留未编辑的问题,以便回复有意义。对不起这种类型,所有。

标签: c++ templates overloading


【解决方案1】:

从第 323 页重新键入代码时出错。只有第一个重载应该是 const,而第二个应该是非const

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

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

这段代码试图说明的一点是,您可以重载const-ness of this 对象上的运算符。 C++ 会从上下文中找出它应该调用两个运算符中的哪一个,然后当SArray 为非常量时返回一个引用,或者当数组为const 时返回一个副本。

【讨论】:

  • 呃,你是对的。多么可怕的问题。我很抱歉。
  • @sunny 不用担心:const 上的重载是一件特别难以发现的事情,如果您以前从未见过这个技巧。好消息是,它让您在未来提防const-ness 运营商,帮助您避免潜在的混乱。
【解决方案2】:

严格来说,你不能重载返回类型。如果您阅读了您链接的问题和答案 (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];
}

【讨论】:

    【解决方案3】:

    在 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];
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 2014-06-13
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多