C ++中的嵌套子类

时间:2016-01-28 14:40:59

标签: c++ subclass inner-classes

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

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

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

  

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

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

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

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

  

警告:无效使用不完整类型&#39; struct X&lt; T&gt;&#39;

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

1 个答案:

答案 0 :(得分:9)

回答基本问题:您收到警告,因为模板尚未实例化,因此不会打扰任何人。

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

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