我们发现了类似以下内容(不要问...):
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 上会失败:
global qualification of class name is invalid before '{' token
从 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
。
关于c++ - 类(class)声明类(class)负责人的全局资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2781339/