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?
GCC wählt 'N :: A :: i'. Fragen, warum. – Barry
@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