如果有
会发生什么 Foo::test(Foo::A &a, Bar::B &b, C &c);
和
Bar::test(Foo::A &a, Bar::B &b, C &c);
。
参数的名称空间是否由编译器按顺序考虑(第一个参数优先于参数依赖查找),或者这被认为是不明确的?
答案 0 :(得分:7)
这将是模棱两可的。重载集包含两个同等有效的重载:
namespace Bar
{
struct B;
}
namespace Foo
{
struct A{};
void test(A& , Bar::B&, int){}
}
namespace Bar
{
struct B{};
void test(Foo::A& , B&, int){}
}
int main() {
Foo::A a; Bar::B b;
test (a, b, 0);
return 0;
}
在gcc上的结果:
prog.cpp:在函数'int main()'中:
prog.cpp:21:15:错误:调用重载'test(Foo :: A&,Bar :: B&,int)'是模糊测试(a,b,0);
^ prog.cpp:10:7:注意:候选人:void Foo :: test(Foo :: A&amp;,Bar :: B&amp;,int)void test(A&amp;,Bar :: B&amp;,int){} ^ prog.cpp:16:7:注意:候选人:void Bar :: test(Foo :: A&amp;,Bar :: B&amp;,int)void test(Foo :: A&amp;,B&amp;,int){} < / p>
答案 1 :(得分:2)
根据标准的第3.4.2节
对于函数调用中的每个参数类型T,都有一组零个或多个关联的命名空间
因此,名称空间Foo
和Bar
都将位于关联命名空间的集合中。由于在两者中都找到了函数test
,因此它将是不明确的。