2010-05-06 2 views
2

Мы нашли что-то похожее на следующее (не спрашивайте ...):Глобальная квалификация в объявлении класса класса головки

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

struct A { struct B; }; 

using namespace N; 

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

Интересно, что это нормально компилируется с VS2005, ICC 11.1 и Комео (он-лайн), но не может с GCC:

глобальная квалификация имени класса является недействительным, прежде чем '{' лексема

от C++ 03, Приложение а, мне кажется, как GCC является правильным:

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

... или я с видом что нибудь?

+0

Звучит как пара для курса с VS2005. – wheaties

ответ

6

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

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

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

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

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

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

+0

Спасибо, подскажите и все, что мне нужно :) –

+0

Отлично! :) ..... –

Смежные вопросы