Глобальная квалификация в объявлении класса class-head - PullRequest
3 голосов
/ 06 мая 2010

Мы нашли что-то похожее на следующее (не спрашивайте ...):

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

... или я что-то упускаю?

1 Ответ

7 голосов
/ 06 мая 2010

Я думаю, что вы понимаете это правильно: GCC реализует стандарт к букве в этом случае, в то время как другие реализуют его менее строго (посмотрите на issue # 355 ).

Вы можете сделать следующее, чтобы обойти ограничение синтаксиса

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

Или вы используете явное имя typedef

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

Или, конечно, вы меняете порядок using namespace и определение вложенного класса. Обратите внимание, что Приложение А является только информативным. Нормативный текст находится в пунктах 5.1/7 и 9.

...