2010-05-06 4 views
2

Nous avons trouvé quelque chose de similaire à ce qui suit (ne demandez pas ...):qualification globale dans une déclaration de classe de classe tête

namespace N { 
    struct A { struct B; }; 
} 

struct A { struct B; }; 

using namespace N; 

struct ::A::B {}; // <- point of interest 

Fait intéressant, cette compile très bien avec VS2005, et 11.1 cpi Comeau (en ligne), mais échoue avec GCC:

qualification globale de nom de classe est invalide avant '{' jeton

de C++ 03, annexe A, il me semble que GCC est droite:

  • la class-head peut consister en nested-name-specifier et identifier
  • nested-name-specifier ne peut commencer par une qualification globale (::)
  • De toute évidence, ne peut pas non identifier

... ou suis-je avec vue quelque chose?

+0

Semble comme par pour le cours avec VS2005. – wheaties

Répondre

6

Je pense que vous avez raison: GCC implémente le standard à la lettre dans ce cas, tandis que les autres l'implémentent moins stricte (jetez un oeil à issue #355).

Vous pouvez effectuer les opérations suivantes pour travailler autour de la limitation de la syntaxe

struct identity<::A>::type::B {}; 

Ou vous utilisez un explicite nommé typedef

typedef ::A AHidden; 
struct AHidden::B { }; 

Ou, bien sûr, vous échangez l'ordre de using namespace et la définition de classe imbriquée. Notez que l'annexe A est informative seulement. Le texte normatif est aux clauses 5.1/7 et 9.

+0

Merci, prompt et tout ce dont j'avais besoin :) –

+0

Parfait! :) ..... –

Questions connexes