【问题标题】:object = -object doesn't compile although operators are overloaded [duplicate]尽管运算符重载,但 object = -object 无法编译[重复]
【发布时间】:2012-11-17 21:25:36
【问题描述】:

可能重复:
How to overload unary minus operator in C++?

我有一个重载许多运算符的 C 类:

class C
{
  ...
  C& operator-=(const C& other) {...}
  const C operator-(const C& other) {...}
}
inline const C operator*(const double& lhs, const C& rhs)

现在我想反转一个 C 类型的对象

c = -c;

而 gcc 给了我以下错误:

no match for >>operator-<< in >>-d<<
candidate is: const C C::operator-(const C&)

使用 c = -1*c 有效,但我希望能够缩短它。我的课缺少什么?


已解决:添加一元运算符-:

C operator-() const {...}

作为 C 的成员。

【问题讨论】:

  • 我的情况略有不同 - 我不知道我必须重载一元运算符。

标签: c++ operator-overloading


【解决方案1】:

您重载了二元 - 运算符。您还需要重载一元 - 运算符

How to overload unary minus operator in C++?

关于如何重载一元运算符

【讨论】:

    【解决方案2】:

    您重载了 二进制 -、二进制 * 和复合赋值 -= 运算符。表达式 c = -c 使用 unary -,您从未重载过。

    如果你想通过一个独立的(也许是朋友)函数重载一元 -,你必须相应地声明它。只需添加 friend 关键字即可在类定义中完成

    class C
    {
      ...
      friend C operator-(const C& other) {...}
    };
    

    或者通过将函数声明移到类定义之外

    class C
    {
      ...
    };
    
    inline C operator -(const C& other) {...}
    

    或者,如果你想将一元-声明为成员,你必须在不带参数的情况下声明它

    class C
    {
      ...
      C operator-() const {...}
    };
    

    【讨论】:

      【解决方案3】:

      进行此更改:

      const C operator-() {...}
      

      【讨论】:

      • 实际上只是将二元运算符更改为一元会破坏我的很多代码
      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多