[英]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.