修复C4150:删除指向不完整类型COldStuff的指针,不包括标题或更改旧代码

时间:2011-03-19 01:25:25

标签: c++ visual-c++ warnings

如何解决错误

  

C4150:删除指向不完整类型COldStuff的指针;没有析构函数叫

不添加标题。 E.g。

class COldStuff;

class CSomething
{
     ...
     CAnother<COldStuff> m_test;
}

我正在使用遗留代码(即COldStuffCAnotherCSomething)。当我添加标头来修复c4150时,我遇到循环依赖,特别是重定义问题。我怎么能解决这个问题;如果我不能将处理警告作为错误关闭,或忽略它,或更改遗留代码....我能以某种方式让编译器知道COldStuff的析构函数或COldStuff是否有析构函数?

4 个答案:

答案 0 :(得分:4)

潜在修复:在源文件中明确定义CSomething的析构函数(即使它只是空的)。

为什么这可能有效:从评论和Rup的优秀问题,我假设CAnother尝试删除COldStuff,此时必须可见。{1}}现在,如果您没有为CSomething显式定义析构函数,那么该部分也会内联实例化(基本上在标题中,给出错误)。但是,如果在CSomething的cpp文件中显式定义析构函数,则会在那里实例化隐式CAnother<COldStuff>::~CAnother,您可以解析循环依赖关系。

答案 1 :(得分:3)

哦,那很糟糕。

也许你可以引入一个带有虚析构函数的基类,然后删除它。但是你不能将不完整的类型转换为它的基类,也不能调用一个知道如何正确删除它的成员函数。

我认为无论你将这些COldStuff对象传递给那些知道如何使用它们的对象,还需要负责删除它们。

至少需要对遗留代码进行一些小的修改才能解决这个问题。

答案 2 :(得分:2)

这不是你可以逃避的事情。删除对象时,编译器必须查看完整类型。如果它有一个析构函数怎么办?

通常的解决方法是将删除放在cpp文件中,其中完整类型可见。如果删除器是一个模板可能很难,但也许你可以使用一个小帮手函数。

答案 3 :(得分:1)

通过包含其头文件来替换COldStuff的前向声明。

相关问题