We found something similar to the following (don't ask ...):
namespace N {
struct A { struct B; };
}
struct A { struct B; };
using namespace N;
struct ::A::B {}; // <- point of interest
Interestingly, this compiles fine with VS2005, icc 11.1 and Comeau (online), but fails with GCC:
global qualification of class name is invalid before '{' token
From C++03, Annex A, it seems to me like GCC is right:
- the
class-head
can consist ofnested-name-specifier
andidentifier
nested-name-specifier
can't begin with a global qualification (::
)- obviously, neither can
identifier
... or am i overlooking something?
I think you are getting it right: GCC implements the standard to the letter in this case, while the others implement it less strict (have a look at issue #355).
You could do the following to work-around the limitation of the syntax
Or you use an explicit named
typedef
Or, of course, you exchange the order of
using namespace
and the nested class definition. Notice that Annex A is informative only. The normative text is at clauses5.1/7
and9
.