2016-10-07 4 views
0

インポートされたオブジェクトクラスを使用しているため、フォーマットはインポートされますか? 同じロジックでは、インポートされたObjectクラスを使用すると、クラスはインポートされません。このコードは、NS1 :: formatとNS3 :: formatのあいまいさをどのように引き起こしますか?

namespace NS1 { 
    class Object { /* ... */ }; 
    int format(const Object&) { std::cout << "NS1"; } 
    namespace NS2 { 
     class Object { /* ... */ }; 
     int format(const Object&) { std::cout << "NS2"; } 
    } 
} 

namespace NS3 { 
    using NS1::Object; 
    int format(const Object&) { std::cout << "NS3"; } 
} 

namespace { using namespace NS3; } 

void fun(Object b, int i) { int i1 = format(b); } 

int main() { 
    Object b; 
    fun(b, 0); 
} 
+0

エラーが発生しますか?あなたはそれを自分で解決しようとしましたか? [尋ねる]を読んだことがありますか? (私も質問があります) –

+0

おそらく[引数依存ルックアップ](http://en.cppreference.com/w/cpp/language/adl)のためですか? – mindriot

答えて

0

のは、GCCが生成するエラーメッセージを見てみましょう:あいまいさが原因argument-dependent lookupの生じ

test.cpp: In function ‘void fun(NS1::Object, int)’: 
test.cpp:19:48: error: call of overloaded ‘format(NS1::Object&)’ is ambiguous 
void fun(Object b, int i) { int i1 = format(b); } 
               ^
test.cpp:19:48: note: candidates are: 
test.cpp:14:5: note: int NS3::format(const NS1::Object&) 
int format(const Object&) { std::cout << "NS3"; } 
    ^
test.cpp:5:5: note: int NS1::format(const NS1::Object&) 
int format(const Object&) { std::cout << "NS1"; } 
    ^

引数依存のルックアップ、またADLとして知られている、またはKoenigルックアップは、関数呼び出し式の中で、過負荷の演算子に対する暗黙の関数呼び出しを含む、未修飾の関数名を検索するための規則のセットです。 これらの関数名は、通常の修飾されていない名前検索によって考慮されるスコープと名前空間に加えて、引数の名前空間で検索されます。あなたのケースでは

、あなたはbNS1::Objectですformat(b)を呼び出そうとしています。

  • あなたがその名前空間を取得したため、機能int NS3::format(const NS1::Object&)が考えられます。
  • ADLのために関数int NS1::format(const NS1::Object&)が考えられます。パラメータは名前空間NS1からのものであるため、NS1の一致関数も考慮されます。
  • 両方の関数は全く同じシグネチャを持つため、あいまいです。

What is "Argument-Dependent Lookup" (aka ADL, or "Koenig Lookup")?も読む価値があります。

+0

これは知識の価値があるたくさんの面白さ –

+0

これはあなたの質問に答えましたか?そうであれば、答えを受け入れることができます。それは、私に知らせてください。 – mindriot

関連する問題