【问题标题】:Global qualification in a class declarations class-head班级声明中的全球资格
【发布时间】:2010-05-06 13:14:34
【问题描述】:

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

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 也不能

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

【问题讨论】:

  • 听起来与 VS2005 的课程相当。

标签: c++ class standards declaration


【解决方案1】:

我认为您说得对:在这种情况下,GCC 严格执行标准,而其他执行标准则不那么严格(请查看 issue #355)。

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

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

或者你使用一个显式命名的typedef

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

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

【讨论】:

  • 谢谢,提示和我需要的一切:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
相关资源
最近更新 更多