コンパイラの警告 (レベル 2) C4150
'type' 型を削除するため delete 演算子が呼び出されましたが、定義がありません
delete
演算子は、宣言された一方で定義されていない型を削除するために呼び出されます。 定義が delete
と同じ翻訳単位内にないため、コンパイラは呼び出すデストラクターを見つけることができません。
例
次の例では、class IncClass
を宣言するが、定義していないため、C4150 が生成されます。
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
この問題を解決するには、IncClass
の定義を delete
と同じファイルに配置します。 クラスがヘッダー ファイルで宣言されている場合は、#include
を使用してファイルに追加できます。 クラスがヘッダー ファイルで宣言されていない場合は、NoDestruct
関数定義を IncClass
定義と同じファイルに移動する必要がある場合があります。
// compile with: /W2
#include "IncClass.h"
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}
同じファイル内のデストラクター呼び出しの後にクラスが定義されていると、C4150 が出力されます。 次の例では、IncClass
は使用する前に宣言されていますが、delete
の後に定義されています。
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
このシナリオでは、クラス定義の後に delete
を使用する必要があります。
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass );
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}