2

10進数の計算を行うクラスがあります。すべての数学演算子がオーバーロードされています。かなり単純な計算には最適ですが、親を追加する必要がある場合は失敗します。たとえば、次の両方の計算が機能し、正しい結果が得られます。

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 に答える