【问题标题】:Fixing C4150: deletion of pointer to incomplete type COldStuff without including header or changing old code修复 C4150:删除指向不完整类型 COldStuff 的指针而不包括标题或更改旧代码
【发布时间】:2011-07-18 13:54:06
【问题描述】:

如何避免错误

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

不添加标题。例如

class COldStuff;

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

我正在为所有这些使用遗留代码(即COldStuffCAnotherCSomething)。当我添加标题来修复 c4150 时,我遇到了循环依赖,尤其是重新定义问题。我还能如何解决这个问题;如果我不能关闭将警告视为错误,或者忽略它,或者更改遗留代码......我可以让编译器知道COldStuff 的析构函数或者COldStuff 确实有析构函数吗?

【问题讨论】:

  • 明确地说,这是因为您在此标头之前包含的 CAanother 模板定义了一个删除 T*? 的内联函数?
  • 没错。对不起,我忘了提到那部分。

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


【解决方案1】:

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

为什么这可能有效:根据 cmets 和 Rup 的优秀问题,我假设 CAnother 尝试删除 COldStuff,此时它必须是可见的。现在,如果您没有为CSomething 显式定义析构函数,那么该部分也会被内联实例化(基本上在标题中,给您错误)。但是,如果你在CSomething的cpp文件中显式定义了析构函数,那么隐式的CAnother&lt;COldStuff&gt;::~CAnother就会在那里实例化,你就可以解决循环依赖了。

【讨论】:

    【解决方案2】:

    哦,那太糟糕了。

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

    我认为最终无论您将这些COldStuff 对象传递给知道如何使用它们,也需要负责删除它们。

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

    【讨论】:

      【解决方案3】:

      这不是你可以逃脱的。删除对象时,编译器必须查看完整的类型。如果它有析构函数呢?

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 2020-04-30
          • 2021-12-31
          • 2012-08-15
          • 1970-01-01
          相关资源
          最近更新 更多