2016-12-15 88 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(例如),然後按通話是不明確的。每個重載都會有一個更好和更差的轉換序列。

相關問題