2016-06-21 3 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++言語の中で最も悪用される部分の1つです。また、コードを散りばめて書くと、どの関数が実際に呼び出されたのかわからないか、忘れてしまい予期しない実行パスをプログラムに導くことができます。たとえあなたのコードがコンパイルされたとしても、あなたはどの関数が呼び出されるのかも分かりませんでした。 – PaulMcKenzie

答えて

3

fun()への電話は曖昧です。 tはタイプTestであり、これはTest2intの両方に変換できるため、両方ともfunの実装が候補です。

+1

要するに、呼び出し側はあいまいさを解決する必要があります。たとえば、 't'で' static_cast'を呼び出します – KABoissonneault

関連する問題