gpt4 book ai didi

c++ - 两级嵌套的 C++ 类适用于 GCC,但不适用于 Clang

转载 作者:太空狗 更新时间:2023-10-29 20:43:03 26 4
gpt4 key购买 nike

我在定义声明它的类之外的内部类时遇到问题。

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)

最佳答案

恐怕 GCC 过于宽容了。 C++11 标准的第 9/1 段指定class-head-name 是:

嵌套名称说明符(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.

在你的例子中,class-specifier struct A::B { } 出现在命名空间的范围内,但在类的范围(尝试将 struct Base 更改为 namespace Base,您将看到 Clang 接受它)。

因此,解决这个问题的正确方法是在命名空间范围内定义类,而不是在 Base 内:

// ...

struct Base::A::B
{
};

关于c++ - 两级嵌套的 C++ 类适用于 GCC,但不适用于 Clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16759025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com