Предупреждение 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
Ответы
Ответ 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.