2015-04-26 9 views
8

Es ist nicht erlaubt einen Namespace zu setzen und eine Klasse mit dem gleichen Namen in eine deklarativen Region, das heißtMehrdeutige Namenssuche mit using-Direktive

namespace A {} 
class A{}; 

is ill-formed (siehe §3.3.1/4). Allerdings kann man den Namen von beiden über eine Verwendungs-Direktive eingeben:

namespace N { namespace A {int i;} } 

struct A {static int i;}; 

using namespace N; 

int i = A::i; // The global struct, or namespace N::A? 

Ist dieser Code schlecht gebildet? VC++ thinks so sowie Clang:

main.cpp:7:9: error: reference to 'A' is ambiguous 
int i = A::i; 
     ^
main.cpp:3:8: note: candidate found by name lookup is 'A' 
struct A {static int i;}; 
    ^
main.cpp:1:25: note: candidate found by name lookup is 'N::A' 
namespace N { namespace A {int i;} } 
         ^

jedoch GCC accepts it.

Wer hat Recht?

+0

GCC wählt 'N :: A :: i'. Fragen, warum. – Barry

+0

@Barry Ich bin genauso verwirrt, da ich erwartet habe, dass es die Deklaration vorzieht, die oberflächlicher ist, d. H. "Näher" an dem Punkt des Nachschlagens. – Columbo

Antwort

6

Der Code ist schlecht formatiert. Wenn aufzublicken A, §7.3.4/6 Schritte:

Wenn Namenssuche findet nach einem Namen eine Erklärung in zwei verschiedenen Namespaces und die Erklärungen nicht ausdrücklich erklären, die gleiche Einheit und deklarieren keine Funktionen , die Verwendung des Namens ist schlecht ausgebildet. Hier

sind die Namensräume der globalen Namensraum und N, und die Einheiten sind die Namespace N::A und die Klasse ::A.