基类的嵌套类的外部定义

时间:2013-09-15 22:54:36

标签: c++ inheritance gcc clang nested-class

以下代码是否有效?

struct A 
{
    struct nested;
};

struct B : public A {};

struct B::nested {};

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

test.cpp:8:14: error: no struct named 'nested' in 'B'
    class B::nested {};
          ~~~^

3 个答案:

答案 0 :(得分:6)

是的,这是无效的。这是引用。

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

  

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

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

答案 1 :(得分:1)

B没有名为nested的嵌套类。只有A有一个名为nested class A::nested { };的嵌套类应该可以正常工作

答案 2 :(得分:0)

您继承自A,因此您未在nested中封装B结构。

从创建的类型为B的结构中,您只能到达结构nested,因为它是结构B的一部分,但构造名为nested的结构体负责A 1}},因为它封装了nested

所有代码都无效。