【问题标题】:Error no match for 'operator*'错误与“操作员*”不匹配
【发布时间】:2013-03-20 19:43:20
【问题描述】:

我有一个进行十进制计算的课程。我有所有的数学运算符重载。它适用于相当简单的计算,但当我需要添加括号时会失败。例如,以下两种计算都可以工作并得到正确的结果:

myClass r, a = 100000, b = 2.5, c = 10, d = 30;
r = c / d * a * b;
r = (c / d) * a * b;

但如果我将计算更改为 r = a * b * (c / d); 编译失败:

error: no match for ‘operator*’ in ‘myClass::operator*(myClass&)((* & b)) * myClass::operator/(myClass&)((* & d))’ in gcc 4.6.2.

我可能遗漏了一些简单的东西,但找不到。我做错了什么?

【问题讨论】:

  • 我们缺少一些简单的东西:带有操作符的代码。
  • 我看着我的水晶球,我看到:你的operator*operator/ 要么不是const,要么它缺少const 参数。 (注意:这是一个完全疯狂的猜测,实际上我们需要您的运营商的签名才能有机会做任何事情,而不是进行疯狂的猜测)
  • 您确定您的operator/const reference 返回到结果实例吗?
  • 确保将 const reference 返回到本地结果似乎是一件“确保”很奇怪的事情。
  • 通常,数学运算符被实现为调用成员函数的函数。例如,函数* 将调用成员*=。通过这种方式,编译器可以对隐式类型转换做出更好的决策。这可能与您的问题有关,但仅凭您的示例很难判断。

标签: c++ operator-overloading operator-precedence


【解决方案1】:

几乎每个人都推测,问题是缺少const 限定符。还有一个因素是返回的是副本而不是参考。

有问题的无效代码是这样的:

myClass operator *= (myClass &num) { return Mul(num); }
myClass operator * (myClass &num) { return Mul(num); }

修正版:

myClass& operator *= (const myClass &num) { Mul(num); return *this; }
friend myClass operator * (const myClass &num1, const myClass &num2) { myClass tmp(num1) tmp.Mul(num2); return tmp; }

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2023-03-10
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多