【问题标题】:Out-of-line definition of base class' nested class基类嵌套类的外线定义
【发布时间】:2013-09-15 22:54:35
【问题描述】:

以下代码有效吗?

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

【问题讨论】:

  • 我认为 A 的私有 nested 类对 B 不可见。
  • @franji1:我认为这与可见性无关。我将类更改为结构,但 clang 仍然拒绝它。

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


【解决方案1】:

是的,这是无效的。这是报价单。

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

如果 class-head-name 包含 nested-name-specifier,则 class-specifier 应指之前直接在 nested-name-specifier 引用的类或命名空间中声明,或在该命名空间的内联命名空间集 (7.3.1) 的元素中 (即,不仅仅是由 using-declaration 继承或引入),并且 class-specifier 应出现在包含先前声明的命名空间中。在这种情况下,定义的 class-head-namenested-name-specifier 不应以 decltype-specifier 开头。

在您的示例中,class-head-name 是标记 B::nested,其中包含 nested-name-specifier B::类名 nestedclass-specifier 是整个 struct B::nested { ... }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您从A 继承,因此您不会将nested 结构封装在B 中。

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

      总而言之,您的代码无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多