2

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

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.

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

4

1 回答 1

3

正如几乎每个人所猜测的那样,问题在于缺少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; }
于 2013-03-21T03:48:55.807 回答