私はC++を学び、C++Primerを使用しています。次の演習14.46を検討してください。
class Complex {
Complex(double);
// ...
};
class LongDouble {
friend LongDouble operator+(LongDouble&, int); // (1)
public:
LongDouble(int);
operator double();
LongDouble operator+(const Complex &); // (2)
// ...
};
LongDouble operator+(const LongDouble &, double); // (3)
LongDouble ld(16.08);
double res = ld + 15.05; // which operator+ ?
上記のプログラムのgcc4.5を使用してコンパイルすると、次のようになります。
14_46.cpp:60:21: error: ambiguous overload for ‘operator+’ in ‘ld + 1.5050000000000000710542735760100185871124267578125e+1’
14_46.cpp:60:21: note: candidates are: operator+(double, double) <built-in>
14_46.cpp:35:5: note: LongDouble LongDouble::operator+(const Complex&)
14_46.cpp:45:1: note: LongDouble operator+(const LongDouble&, double)
14_46.cpp:17:5: note: LongDouble operator+(LongDouble&, int)
(3)が選択されていないのはなぜですか?完全に一致していませんか?
ただし、(3)のパラメータの定数を削除すると、完全に一致することに気付きました。
LongDouble operator+(LongDouble &, double); // (4)
(4)を使用すると、あいまいさはありません。ここで何かが足りませんか?