5

これは私と数人の同僚を混乱させてきましたが、これが約5つの異なるコンパイラに対するエラーであることを確認しました。それらのすべては、この小さなコードスニペットが「あいまい」であることを返します。

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);
}

Clangは以下を返します:

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名前空間を含めるべきではないのに、なぜそこで検索するのでしょうか。なぜこれが曖昧なのですか?

4

1 に答える 1

8

これは、引数に依存するルックアップです。の引数barfoo名前空間にあるため、barもその名前空間で検索され、あいまいさが生じます。fooグローバル名前空間からを明確に呼び出す場合は、を呼び出します::foo

于 2012-04-19T19:19:44.570 に答える