班级声明中的全球资格

Posted

技术标签:

【中文标题】班级声明中的全球资格【英文标题】: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 的课程相当。 【参考方案1】:

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

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

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

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

typedef ::A AHidden;
struct AHidden::B  ;

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

【讨论】:

谢谢,提示和我需要的一切:)

以上是关于班级声明中的全球资格的主要内容,如果未能解决你的问题,请参考以下文章

Z3:如何办理协会或会员资格?

两个类(C++)中的类到类转换 - 前向声明?

PRINCE2如何完善PMBOK和您的PMP资格证书?

Kafka Connect 中的静态成员资格

测试 Scala 类型类中的成员资格

熊猫数据框列中的成员资格测试