Я думаю, что вы понимаете это правильно: GCC реализует стандарт к букве в этом случае, в то время как другие реализуют его менее строго (посмотрите на issue # 355 ).
Вы можете сделать следующее, чтобы обойти ограничение синтаксиса
struct identity< ::A >::type::B {};
Или вы используете явное имя typedef
typedef ::A AHidden;
struct AHidden::B { };
Или, конечно, вы меняете порядок using namespace
и определение вложенного класса. Обратите внимание, что Приложение А является только информативным. Нормативный текст находится в пунктах 5.1/7
и 9
.