我有一个做十进制计算的类。我所有的数学运算符都超载了。它适用于相当简单的计算,但是当我需要添加括号时会失败。例如,以下工作中的两个计算均会获得正确的结果:
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.
我可能缺少简单的东西,但找不到它。我究竟做错了什么?
最佳答案
几乎每个人都认为,这个问题缺少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; }