C ++ Koenig(Argument-Dependent)查找:如果不同名称空间中的两个名称空间函数具有相同的参数类型,该怎么办?

时间:2016-11-03 11:54:39

标签: c++ argument-dependent-lookup

如果有

会发生什么

Foo::test(Foo::A &a, Bar::B &b, C &c);

Bar::test(Foo::A &a, Bar::B &b, C &c);

参数的名称空间是否由编译器按顺序考虑(第一个参数优先于参数依赖查找),或者这被认为是不明确的?

2 个答案:

答案 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,都有一组零个或多个关联的命名空间

因此,名称空间FooBar都将位于关联命名空间的集合中。由于在两者中都找到了函数test,因此它将是不明确的。