Исправление C4150: удаление указателя на неполный тип COldStuff без включения заголовка или изменения старого кода - PullRequest
2 голосов
/ 19 марта 2011

Как обойти ошибку

C4150: удаление указателя на неполный тип COldStuff; деструктор не называется

без добавления заголовка. Э.Г.

class COldStuff;

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

Я использую устаревший код для всего этого (т.е. COldStuff, CAnother, CSomething). Когда я добавляю заголовок для исправления c4150, я сталкиваюсь с циклической зависимостью и особенно с проблемами переопределения. Как еще я могу обойти эту проблему; если я не могу отключить, обрабатывать предупреждение как ошибку, или игнорировать это, или изменять устаревший код .... Могу ли я как-то сообщить компилятору деструктор COldStuff или у COldStuff есть деструктор?

Ответы [ 4 ]

4 голосов
/ 19 марта 2011

Потенциальное исправление : явно укажите деструктор для CSomething в вашем исходном файле (даже если он просто пуст).

Почему это, вероятно, работает : Исходя из комментариев и превосходного вопроса Рупа, я предполагаю, что CAnother пытается удалить COldStuff, и в этот момент он должен быть виден. Теперь, если вы явно не определили деструктор для CSomething, эта часть тоже создается inline (в основном в заголовке, сообщая об ошибке). Однако, если вы явно определите деструктор в файле cpp CSomething, там создается неявный CAnother<COldStuff>::~CAnother, и вы можете разрешить циклическую зависимость.

3 голосов
/ 19 марта 2011

О, это плохо.

Может быть, вы могли бы ввести базовый класс с виртуальным деструктором и удалить таким образом.Но вы не можете привести неполный тип к его базовому классу, и при этом вы не можете вызвать функцию-член, которая знает, как правильно его удалить.как их использовать, также должен нести ответственность за их удаление.

Для исправления этого потребуется внести хотя бы небольшие изменения в унаследованный код.

2 голосов
/ 19 марта 2011

Это не то, что вы можете сойти с рук. При удалении объекта компилятор должен видеть полный тип. Что если у него есть деструктор?

Обычное исправление - поместить удаление в файл cpp, где виден полный тип. может быть сложно, если удалитель является шаблоном, но, возможно, вы можете использовать небольшую вспомогательную функцию.

1 голос
/ 30 января 2015

Заменить прямое объявление COldStuff, включив его заголовочный файл.

...