C++不同命名空间中函数的歧义调用

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命名空间,那么为什么要在那里搜索?为什么会出现歧义?


5
了解ADL(Argument-dependent name lookup),又称Koenig查找,请阅读相关内容。 - ildjarn
在gcc中:http://ideone.com/G4uHo - Mark Ransom
这似乎不是编译器错误。g++、HP C++和Comeau都会产生类似的错误。 - daxelrod
1
@daxelrod 这是标准行为。 - juanchopanza
嗨,乔纳森,我注意到问题仍然没有解决。还有什么不清楚的吗? - juanchopanza
1个回答

8

这是 参数相关名称查找bar 的参数在 foo 命名空间中,因此也会在该命名空间中查找 bar ,从而导致歧义。如果您想从全局命名空间中无歧义地调用 foo ,请调用 ::foo


使用“作用域解析”运算符:::bar()来修复它 :) - Gui13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接