2016-06-21 91 views
-1

爲什麼我沒有得到輸出。我期待有趣(Test2)稱爲輸出。由於函數傳遞的參數不同,所以不應該有任何衝突。C++運算符超載衝突

#include <iostream> 
using namespace std; 
class Test2 
{ 
    int y; 
}; 

class Test 
{ 
    int x; 
    Test2 t2; 
public: 
    operator Test2() { return t2; } 
    operator int() { return x; } 
}; 

void fun (int x) { cout << "fun(int) called"; } 
void fun (Test2 t) { cout << "fun(Test 2) called"; } 

int main() 
{ 
    Test t; 
    fun(t); 
    return 0; 
} 
+1

IMO,鑄造操作員是C++語言中濫用最多的部分之一。而且,當你編寫散佈的代碼時,你不會知道或忘記哪個函數實際被調用,並且可能導致程序下降到一個意想不到的執行路徑。即使你的代碼編譯完成,你甚至不確定哪個函數會被調用。 – PaulMcKenzie

回答

3

您對fun()的呼叫不明確。 t的類型爲Test,它可以轉換爲Test2int,因此兩個fun實現都是候選。

+1

總之,調用者必須自己解決模糊性問題,例如通過調用't'上的'static_cast' – KABoissonneault