其他分享
首页 > 其他分享> > 两级嵌套c类与GCC一起使用但与Clang失败

两级嵌套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