Глобална квалификация в клас декларации class-head

Открихме нещо подобно на следното (не питайте...):

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

struct A { struct B; };

using namespace N;

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

Интересното е, че това се компилира добре с VS2005, icc 11.1 и Comeau (онлайн), но не успява с GCC:

глобалната квалификация на името на класа е невалидна преди токена '{'

От C++03, Приложение A ми се струва, че GCC е прав:

  • class-head може да се състои от nested-name-specifier и identifier
  • nested-name-specifier не може да започне с глобална квалификация (::)
  • очевидно нито може identifier

... или пропускам нещо?


person Georg Fritzsche    schedule 06.05.2010    source източник
comment
Звучи като пара за курса с VS2005.   -  person wheaties    schedule 06.05.2010


Отговори (1)


Мисля, че го разбирате правилно: GCC прилага стандарта до буквата в този случай, докато другите го прилагат по-малко стриктно (погледнете проблем #355).

Можете да направите следното, за да заобиколите ограничението на синтаксиса

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

Или използвате изрично име typedef

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

Или, разбира се, разменяте реда на using namespace и дефиницията на вложен клас. Забележете, че Приложение А е само информативно. Нормативният текст е в клаузи 5.1/7 и 9.

person Johannes Schaub - litb    schedule 06.05.2010
comment
Благодаря, бързо и всичко, от което се нуждаех :) - person Georg Fritzsche; 06.05.2010