基类的嵌套类的外部定义

HC4*_*ica 2 c++ inheritance gcc clang nested-class

以下代码是否有效?

struct A 
{
    struct nested;
};

struct B : public A {};

struct B::nested {};
Run Code Online (Sandbox Code Playgroud)

gcc接受它,但是clang拒绝它并出现以下错误:

test.cpp:8:14: error: no struct named 'nested' in 'B'
    class B::nested {};
          ~~~^
Run Code Online (Sandbox Code Playgroud)

asc*_*ler 6

是的,这是无效的.这是报价.

第9节第11段,强调我的:

如果class-head-name包含嵌套名称说明符,则类说明符应引用先前在嵌套名称说明符所引用的类或命名空间中直接声明的类,或者在该命名空间的内联命名空间集(7.3.1)(即,不仅仅是由using-declaration继承或引入),并且类说明符应出现在包含前一个声明的命名空间中.在这种情况下,定义的类头名嵌套名称说明符不应以decltype-specifier开头.

在您的示例中,class-head-name是标记B::nested,它包含嵌套名称说明符 B::类名称 nested.在类说明符是整个struct B::nested {... }.