我有一个进行十进制计算的类。我让所有数学运算符都重载了。它适用于相当简单的计算,但在我需要添加parens时失败。例如,在以下工作中进行两次计算并得到正确的结果:
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.
我可能错过了一些简单的东西,却找不到它。我做错了什么?
答案 0 :(得分: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; }