全球资格

问题描述:

我们发现了类似下面的内容(不要问...):全球资格

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

struct A { struct B; }; 

using namespace N; 

struct ::A::B {}; // <- point of interest 

有趣的是,该编译罚款与VS2005,ICC 11.1和科莫(在线),但失败并GCC:

类名的全球资格是无效之前, '{' 令牌

从C++ 03,附件A,它似乎对我来说,GCC是正确的:

  • class-head可以由nested-name-specifieridentifier
  • nested-name-specifier不能以全球资格(::
  • 开始明显,既不可以identifier

...还是我俯瞰什么?

+0

听起来像VS2005课程的标准。 – wheaties 2010-05-06 13:19:03

我认为你的判断正确:在这种情况下GCC实现了标准的信件,而其他标准实施它不太严格(看看issue #355)。

你可以做下面的工作,周围的语法

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

的限制,或者你用一个明确的命名typedef

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

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

+0

谢谢,提示和我需要的所有:) – 2010-05-06 14:00:51

+0

完美! :)...... – 2010-05-06 14:18:53