Подтвердить что ты не робот

Предупреждение C4275 в Visual Studio

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

warning 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
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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