正常查找失败时正在运行c ++ ADL查找,在此示例中,我收到有关模糊g调用的错误。我认为正常查找应该只找到B :: g。为什么我错了?
namespace A
{
struct X{
};
struct Y{
};
void g(X){
}
void h(){
}
}
namespace B
{
void g(A::X x);
void g(A::X x) { g(x);}
}
错误:
error: call to 'g' is ambiguous
void g(A::X x) { g(x); }
^
c0202.cpp:9:10: note: candidate function
void g(X){
^
c0202.cpp:20:10: note: candidate function
void g(A::X x) { g(x); }
答案 0 :(得分:4)
正常查找失败时正在运行c ++ ADL查找
不,依赖于参数的查找总是与正常查找一起发生。这就是重点。
假设你有
struct S { /* ... */ };
void swap(S &, S &) { /* ... */ }
您不希望标准库函数(在std
命名空间中定义)无法找到此用户定义的swap
函数,是吗?他们总是能够看到std::swap
,因为他们自己是std
命名空间的一部分,但他们可能仍然更喜欢ADL找到的::swap
。