2016-12-15 131 views
0

我已经写了MyComplex类和过载的加号(+)运算为:为什么此代码不会产生ambigous通话错误?

class MyComplex 
{ 
public: 
     operator int() { return realPart; } 
     MyComplex(int r, int i=0) 
     { 
       realPart = r; 
       imaginaryPart = i; 
     } 

    int operator +(int i) { return imaginaryPart+i; } 
private: 
     int realPart, imaginaryPart; 
}; 

int main() 
{ 
     MyComplex c(5, 4); 
     cout << c+10 << "\n"; // Why is this not ambiguous? 
} 

我想表达C + 10可能被解释或者作为尝试添加两个整数(Ç in c + 10会使用转换运算符运算符int())或通过超载运算符函数int operator +(int i)作为重载运算符调用降级为整数。但程序编译没有任何错误,并产生了14的输出。如何?

+2

完全匹配更好 – Danh

+0

当你写'1 + 2'可以被解释为试图添加两个整数,或试图将它们转换为'double'并添加它们? – immibis

+0

c + 10相当于c +(10)ant的perfact匹配是int运算符+(int i)。 – user1438832

回答

2

当我们计算出c+10意味着什么时,我们执行一个称为重载分辨率的过程,该过程首先通过名称查找找到所有可行候选项。

在这种情况下,可行的候选人是:

MyComplex::operator+(MyComplex&, int); // via c.operator+(10) 
::operator+(int, int);     // via c.operator int() + 10 

我们再看看其转换序列更好。对于第一次过载,无需转换 - cMyComplex的完全匹配,10int的完全匹配。对于第二个重载,第二个参数完全匹配,但第一个参数必须通过MyComplex::operator int()进行用户定义的转换。

精确匹配的排名高于转换,所以首选过载是首选。


注意,如果不是您MyComplex::operator+()花了long(例如),然后按通话是不明确的。每个重载都会有一个更好和更差的转换序列。

相关问题