繁体   English   中英

C ++中的嵌套子类

[英]Nested subclasses in C++

我正在尝试创建一个嵌套类,它也是其父类的子类:

struct X { struct Y : public X {}; };

不幸的是,在C ++中似乎不允许这样做,因为g ++会产生错误

错误:无效使用不完整类型'struct X'

但是,我的实际代码将X作为模板类:

template<typename T> struct X
{ struct Y : public X {}; };

我收到相同的消息,但这次只是一个警告:

警告:无效使用不完整类型'struct X <T>'

我的问题是:为什么前一种情况是非法的,而模板化的案例只是发出警告? 模板化版本的工作方式完全符合我的预期(我可以创建X<T>::Y实例,将它们转换为X<T> ,依此类推)但警告意味着我不应该使用它? 如果忽略警告,我可能会遇到什么问题?

回答基本问题:你得到一个警告,因为模板还没有实例化,所以它不会打扰任何人。

在这两种情况下,修复此问题的方法是在X的布局已知的位置定义X::Y ,因此可以正确推导出Y的布局。 你可以这样做:

struct X { struct Y; }
struct X::Y {};

从技术上讲,就编译器而言,在模板( X )实例化之前,不需要知道基础( X )的布局。 并且模板( X )在完全定义之前可能无法实现。 在这一点上,它的布局是已知的。

从模板中获取错误的最简单方法是在X尝试istantiate Y

template<typename T> struct X {
    struct Y : public X {};
    Y y;
};

在编译器的早期版本中,在您显示的情况下没有警告,但是在某些时候添加了它。 以下是GCC漏洞追踪者关于该警告是否是虚假的讨论。 标准是否允许这样做存在一些不确定性,但他们的结论是不允许这样做。

因此,标准不允许任何情况,但GCC继续与后者合作,因为它可以。

Yam Marcovic演示如何以符合标准的方式定义X::Y gcc bugtracker中显示了类似的相同示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM