Consider: namespace B { struct C {}; } namespace A { namespace C { } using namespace B; } struct A::C c; GCC complains: error: 'C' in namespace 'A' does not name a type Not knowing much about the subtleties of name lookup myself, I'm relying on the following two sources for the code's well-formed-ness: * Comeau 4.3.10.1 /does/ accept the code. * The opinion of a particularly well-read regular (litb) on Freenode's C++ IRC channel.
I think the code is valid 3.4.4 [basic.lookup.elab]/1 An elaborated-type-specifier (7.1.6.3) may be used to refer to a previously declared class-name or enum-name even though the name has been hidden by a non-type declaration (3.3.10).
I also think the code is valid. In this case though, there is the complication that no hiding takes place: The qualified name lookup of "X::m" for namespace members says in 3.4.3.2/2: "using-directives are ignored in any namespace, including X, directly containing one or more declarations of m". That would mean that "using namespace B;" is ignored, because "C" is declared as a namespace there. But 3.4.4/3 says: "If the name is a qualified-id, the name is looked up according its qualifications, as described in 3.4.3, but ignoring any non-type names that have been declared.". That is, the declaration of the namespace is ignored, thus not preventing the consideration of the using directive.
(In reply to comment #2) > I also think the code is valid. In this case though, there is the complication > that no hiding takes place [...] > Wasn't aware that this is also a case of hiding, but 3.3.10 about hiding actually even contains it.
Seems to be fixed, thanks!