C ++对不同命名空间中的函数的模糊调用

时间:2012-04-19 19:18:04

标签: c++ filenames

这个让我和一些同事感到困惑,但我们已经证实这是对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.

为什么会这样?代码中没有“使用”语句。解决方案顺序不应该包含foo命名空间,那为什么要在那里搜索呢?为什么这个含糊不清?

1 个答案:

答案 0 :(得分:8)

这是argument dependent lookupbar的参数位于foo命名空间中,因此也会在该命名空间中查找bar,从而导致歧义。如果您想从全局命名空间中调用foo,请取消::foo