Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
usunięcie wskaźnika do niekompletnego typu "type"; brak destruktora o nazwie
Operator delete jest wywoływany w celu usunięcia typu, który został zadeklarowany, ale nie został zdefiniowany. Kompilator nie może odnaleźć destruktora do wywołania, ponieważ definicja nie znajduje się w tej samej jednostce tłumaczenia co element delete.
Przykład
Poniższy przykład generuje C4150, deklarując, ale nie definiując elementu class IncClass:
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
Aby rozwiązać ten problem, umieść definicję IncClass w tym samym pliku co .delete Jeśli klasa jest zadeklarowana w pliku nagłówkowym, można ją dodać do pliku przy użyciu polecenia #include. Jeśli klasa nie jest zadeklarowana w pliku nagłówkowym, NoDestruct może być konieczne przeniesienie definicji funkcji do tego samego pliku co IncClass definicja.
// compile with: /W2
#include "IncClass.h"
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}
C4150 będzie emitowany, gdy klasa jest zdefiniowana po wywołaniu destruktora w tym samym pliku. W poniższym przykładzie IncClass jest zadeklarowany przed rozpoczęciem użycia, ale zdefiniowany po pliku delete:
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
W tym scenariuszu delete użycie musi być po definicji klasy.
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass );
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}