两级嵌套c类与GCC一起使用但与Clang失败
作者:互联网
我在定义声明它的类之外的内部类时遇到了问题.
struct Base {
struct A {
struct B;
};
struct A::B {
};
};
它编译并与GCC一起工作但在Clang上失败并出现此错误:
innerclass.cpp:6:12: error: non-friend class member 'B' cannot have a qualified name
struct A::B {
~~~^
如果省略最外面的类Base,则代码适用于Clang.
以这种方式定义内部类是不合法的吗?如果是这样,应该怎么做?
平台:
OS X 10.8.3
XCode 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)
解决方法:
我担心海湾合作委员会要宽容. C 11标准第9/1段规定,班级名称是:
nested-name-specifier(opt)类名
这意味着限定名称可以用作类的名称.此外,第9/11段的第一部分规定:
If a class-head-name contains a nested-name-specifier, the class-specifier shall refer to a class that was
previously declared directly in the class or namespace to which the nested-name-specifier refers, […]
你确实在A类中声明了B类.但是,同一段的第二部分增加了:
[…] and the class-specifier shall appear in a namespace enclosing the previous declaration. In such cases, the nested-name-specifier of the class-head-name of the definition shall not begin with a
decltype-specifier.
在您的情况下,类指定符struct A :: B {}不出现在命名空间的范围内,而是出现在类的范围内(尝试将struct Base更改为命名空间Base,您将看到Clang接受它).
因此,解决此问题的正确方法是在命名空间范围内定义类,而不是在Base中定义:
// ...
struct Base::A::B
{
};
标签:nested-class,c,macos,clang 来源: https://codeday.me/bug/20190831/1779048.html