Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两级嵌套c++;类与GCC一起工作,但与Clang一起失败_C++_Macos_Clang_Nested Class - Fatal编程技术网

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
{
};