2016-11-03 1 views

Répondre

7

Ce sera ambigu. L'ensemble de surcharge contient deux surcharges tout aussi valables:

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; 
} 

résultats sur gcc dans:

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

Selon la section 3.4.2 de la norme

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

Ainsi, les deux espaces de noms et FooBar sera dans l'ensemble des espaces de noms associés. Comme la fonction test est trouvée dans les deux, elle sera ambiguë.