2012-04-19 6 views
5

これは私といくつかの同僚を混乱させていますが、これは約5種類のコンパイラに対するエラーであることを確認しました。それらのすべてが、この小さなコードスニペットが「あいまい」であると返す。異なる名前空間の関数に対するC++のあいまいな呼び出し

namespace foo { 
    struct type_t { 
    int x; 
    }; 
    void bar(type_t &); 
} 

void bar(foo::type_t &); 

void func(void) { 
    foo::type_t x = { 10 }; 
    bar(x); 
} 

クランは、次の値を返します。

func.cpp:12:3: error: call to 'bar' is ambiguous 
    bar(x); 
    ^~~ 
func.cpp:5:8: note: candidate function 
    void bar(type_t &); 
    ^
func.cpp:8:6: note: candidate function 
void bar(foo::type_t &); 
    ^
1 error generated. 

ですが、なぜでしょうか?コードに "using"ステートメントはありません。解決順序はfoo名前空間を含んではいけません。なぜそれがそこで検索されていますか?なぜこれはあいまいですか?

+5

[ADL](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup)、別名Koenigルックアップを読む。 – ildjarn

+0

gcc:http://ideone.com/G4uHo –

+0

これはコンパイラのバグではないようです。同様のエラーは、g ++、HP C++、およびComeauによって生成されます。 – daxelrod

答えて

8

argument dependent lookupです。 barへの引数はfoo名前空間にあるため、その名前空間でもbarが参照され、あいまいさが発生します。グローバルネームスペースからfooを呼び出す場合は、曖昧さなく::fooを呼び出します。

+0

はい、 "descoping"演算子を使用してください::: bar() 'を修正するには: – Gui13

+0

@ Gui13ありがとう、私はちょうどそれを追加していた – juanchopanza

関連する問題