全球资格
问题描述:
我们发现了类似下面的内容(不要问...):全球资格
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-specifier
和identifier
-
nested-name-specifier
不能以全球资格(::
) - 开始明显,既不可以
identifier
...还是我俯瞰什么?
答
我认为你的判断正确:在这种情况下GCC实现了标准的信件,而其他标准实施它不太严格(看看issue #355)。
你可以做下面的工作,周围的语法
struct identity<::A>::type::B {};
的限制,或者你用一个明确的命名typedef
typedef ::A AHidden;
struct AHidden::B { };
或者,当然了,你交换的using namespace
顺序和嵌套的类定义。请注意,附录A仅供参考。规范性文本在条款5.1/7
和9
。
+0
谢谢,提示和我需要的所有:) – 2010-05-06 14:00:51
+0
完美! :)...... – 2010-05-06 14:18:53
听起来像VS2005课程的标准。 – wheaties 2010-05-06 13:19:03