类声明类头中的全局限定

Geo*_*che 3 c++ standards class declaration

我们发现类似于以下内容(不要问......):

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

struct A { struct B; };

using namespace N;

struct ::A::B {}; // <- point of interest
Run Code Online (Sandbox Code Playgroud)

有趣的是,这与VS2005,icc 11.1和Comeau(在线)编译良好,但与GCC失败:

在'{'标记之前,类名的全局限定无效

从C++ 03,附件A,在我看来,像GCC是对的:

  • class-head可以由nested-name-specifieridentifier
  • nested-name-specifier不能以全球资格开始(::)
  • 显然,两者都不能 identifier

......还是我忽略了什么?

Joh*_*itb 7

我认为你做得对:GCC在这种情况下实现了标准,而其他人则不那么严格(看看问题#355).

您可以执行以下操作来解决语法限制

struct identity< ::A >::type::B {}; 
Run Code Online (Sandbox Code Playgroud)

或者您使用显式命名 typedef

typedef ::A AHidden;
struct AHidden::B { };
Run Code Online (Sandbox Code Playgroud)

或者,当然,您交换using namespace了嵌套类定义的顺序.请注意,附件A仅供参考.规范性文本在条款5.1/79.