これは私といくつかの同僚を混乱させていますが、これは約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名前空間を含んではいけません。なぜそれがそこで検索されていますか?なぜこれはあいまいですか?
[ADL](http://en.wikipedia.org/wiki/Argument-dependent_name_lookup)、別名Koenigルックアップを読む。 – ildjarn
gcc:http://ideone.com/G4uHo –
これはコンパイラのバグではないようです。同様のエラーは、g ++、HP C++、およびComeauによって生成されます。 – daxelrod