Предупреждение C4275 в Visual Studio - PullRequest
13 голосов
/ 06 марта 2011

Я получаю это предупреждение при компиляции моего кода в VS2008

предупреждение C4275: не интерфейс dll-интерфейса 'std :: runtime_error', используемый в качестве базы для класса dll-интерфейса 'MyException' 2> c: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ include \ stdexcept (148): см. Объявление 'std :: runtime_error'

Мой класс определен как

class MyException : public std::runtime_error

Ответы [ 2 ]

16 голосов
/ 06 марта 2011

MSDN: http://msdn.microsoft.com/en-us/library/3tdb471s.aspx

"Экспортированный класс [как в DLL] был получен из класса, который не был экспортирован [как в DLL]."

Очевидно, вы объявляете MyException экспортируемым из DLL (используя: __declspec(dllexport)), в то время как std::runtime_error не экспортируется. Подумайте, действительно ли MyException нужно экспортировать. Однако, если ни одна из проблем, перечисленных на приведенной выше странице, не относится к вашему конкретному случаю, вы можете игнорировать это предупреждение - просто имейте в виду проблемы.

0 голосов
/ 26 января 2018

Я попал сюда в поисках ответа на ту же проблему. У меня было пользовательское исключение, полученное из std :: runtime_error, и я экспортировал его из моей dll.

Для исключений кажется, что самое простое решение - НЕ ЭКСПОРТИРОВАТЬ производный класс. Вы можете сделать это, если переместите свою реализацию из исходного файла (.CPP) в заголовок (.HPP). Для меня это было тривиально. Я полагаю, что в большинстве случаев с исключениями это будет так.

Это «хорошая вещь», потому что клиент на самом деле компилирует и связывает реализацию вашего пользовательского исключения со своей реализацией std :: runtime_error. Это то, что вам нужно, и именно это и пытается защитить вас от предупреждения C4275: несовместимость между двумя типами объектов std :: runtime_exception во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...