类声明类头中的全局限定

时间:2010-05-06 13:14:35

标签: c++ class standards declaration

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

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-specifieridentifier
  • nested-name-specifier无法以全球资格认证(::
  • 开头
  • 很明显,identifier
  • 也不行

......或者我忽略了什么?

1 个答案:

答案 0 :(得分:7)

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

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

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

或者您使用明确的名为typedef

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

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