2016-11-03 13 views
2

Что произойдет, если естьC++ Koenig (Аргумент-зависимый) Поиск: что, если два пространства имен работают в разных пространствах имен, имеют одинаковые типы аргументов?

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

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

Являются ли пространства имен аргументов, рассмотренных в порядке компилятором (первый аргумент имеет приоритет для зависимого от аргумента поиска), или это считается неоднозначным?

ответ

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: In function 'int main()':
prog.cpp:21:15: error: call of overloaded 'test(Foo::A&, Bar::B&, int)' is ambiguous test (a, b, 0);
^prog.cpp:10:7: note: candidate: void Foo::test(Foo::A&, Bar::B&, int) void test(A& , Bar::B&, int){} ^prog.cpp:16:7: note: candidate: void Bar::test(Foo::A&, Bar::B&, int) void test(Foo::A& , B&, int){}

2

Согласно разделу 3.4.2 стандартного

For each argument type T in the function call, there is a set of zero or more associated namespaces

Так как пространство имен и FooBar будет в наборе связанных пространств имен. Поскольку функция test находится в обоих случаях, она будет неоднозначной.

 Смежные вопросы

  • Нет связанных вопросов^_^