如何解决错误
C4150:删除指向不完整类型COldStuff的指针;没有析构函数叫
不添加标题。 E.g。
class COldStuff;
class CSomething
{
...
CAnother<COldStuff> m_test;
}
我正在使用遗留代码(即COldStuff
,CAnother
,CSomething
)。当我添加标头来修复c4150时,我遇到循环依赖,特别是重定义问题。我怎么能解决这个问题;如果我不能将处理警告作为错误关闭,或忽略它,或更改遗留代码....我能以某种方式让编译器知道COldStuff
的析构函数或COldStuff
是否有析构函数?
答案 0 :(得分:4)
潜在修复:在源文件中明确定义CSomething
的析构函数(即使它只是空的)。
为什么这可能有效:从评论和Rup的优秀问题,我假设CAnother
尝试删除COldStuff
,此时必须可见。{1}}现在,如果您没有为CSomething
显式定义析构函数,那么该部分也会内联实例化(基本上在标题中,给出错误)。但是,如果在CSomething
的cpp文件中显式定义析构函数,则会在那里实例化隐式CAnother<COldStuff>::~CAnother
,您可以解析循环依赖关系。
答案 1 :(得分:3)
哦,那很糟糕。
也许你可以引入一个带有虚析构函数的基类,然后删除它。但是你不能将不完整的类型转换为它的基类,也不能调用一个知道如何正确删除它的成员函数。
我认为无论你将这些COldStuff
对象传递给那些知道如何使用它们的对象,还需要负责删除它们。
至少需要对遗留代码进行一些小的修改才能解决这个问题。
答案 2 :(得分:2)
这不是你可以逃避的事情。删除对象时,编译器必须查看完整类型。如果它有一个析构函数怎么办?
通常的解决方法是将删除放在cpp文件中,其中完整类型可见。如果删除器是一个模板可能很难,但也许你可以使用一个小帮手函数。
答案 3 :(得分:1)
通过包含其头文件来替换COldStuff的前向声明。