班级声明中的全球资格
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-specifier
和identifier
组成
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/7
和9
。
【讨论】:
谢谢,提示和我需要的一切:)以上是关于班级声明中的全球资格的主要内容,如果未能解决你的问题,请参考以下文章