我试图创建一个嵌套类,它也是其父类的子类:
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>
,等等),但警告是否意味着我不应该使用它?如果忽略警告,我可能会遇到哪些问题?
答案 0 :(得分:9)
回答基本问题:您收到警告,因为模板尚未实例化,因此不会打扰任何人。
在这两种情况下,修复此问题的方法是在已知X::Y
布局的位置定义X
,因此Y
的布局可以适当推断。你可以这样做:
struct X { struct Y; }
struct X::Y {};