C++ 两级嵌套c++;类与GCC一起工作,但与Clang一起失败
在声明内部类的类之外定义内部类时遇到问题C++ 两级嵌套c++;类与GCC一起工作,但与Clang一起失败,c++,macos,clang,nested-class,C++,Macos,Clang,Nested Class,在声明内部类的类之外定义内部类时遇到问题 struct Base { struct A { struct B; }; struct A::B { }; }; 它编译GCC并使用GCC,但在Clang上失败,出现以下错误: innerclass.cpp:6:12: error: non-friend class member 'B' cannot have a qualified name struct A::B {
struct Base {
struct A {
struct B;
};
struct A::B {
};
};
它编译GCC并使用GCC,但在Clang上失败,出现以下错误:
innerclass.cpp:6:12: error: non-friend class member 'B' cannot have a qualified name
struct A::B {
~~~^
如果省略了最外层的类基址,代码将在Clang上工作
这样定义内部类是非法的吗?如果是,应如何做
平台:OS X 10.8.3
代码4.6.2
Clang Apple LLVM版本4.2(Clang-425.0.24)(基于LLVM 3.2svn)
GCC GCC版本4.2.1(基于Apple Inc.build 5658)(LLVM build 2336.11.00)恐怕GCC是被允许的。C++11标准的第9/1段规定,类头名称是: 嵌套名称说明符(opt)类名 这意味着一个限定名可以用作类的名称。此外,第9/11段第一部分规定: 如果类头名称包含嵌套的名称说明符,则该类说明符应引用 以前直接在嵌套名称说明符所引用的类或命名空间中声明,[…] 您确实在类
A
中声明了类B
。但是,同一段的第二部分增加了:
[…]和类说明符应出现在包含先前声明的命名空间中。在这种情况下,定义的类头名称的嵌套名称说明符不得以
decltype说明符
在您的例子中,类说明符struct A::B{}
不出现在名称空间的范围内,而是出现在类的范围内(尝试将struct Base
更改为namespace Base
,您将看到Clang接受它)
因此,解决这个问题的正确方法是在名称空间范围内定义类,而不是在Base
内:
// ...
struct Base::A::B
{
};