【发布时间】:2011-07-18 16:57:38
【问题描述】:
我正在学习 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+ ?
当我使用 gcc 4.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) 中删除参数的 const-ness 完全匹配,即,
LongDouble operator+(LongDouble &, double); // (4)
使用 (4) 没有歧义。我在这里遗漏了什么吗?
【问题讨论】: