2013-03-20 138 views
0

我有一个类来做小数计算。我把所有的数学运算符都重载了。它适用于相当简单的计算,但在需要添加父元素时失败。例如,在下面的工作都计算并得到正确的结果:错误'operator *'不匹配

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. 

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

+7

我们失去了一些东西很简单:与运营商的代码。 – 2013-03-20 19:44:23

+2

我看着我的水晶球,我看到:你的'operator *'或'operator /'或者不是'const',或者它没有'const'参数。 (注意:这是一个完全疯狂的猜测,实际上我们需要你的操作符的签名才有机会做任何事情,除了做出疯狂的猜测) – Yakk 2013-03-20 19:48:08

+0

你确定你的'operator /'返回一个'const引用'给结果实例? – Porkbutts 2013-03-20 19:48:10

回答

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; }