2011-03-06 418 views
12

在VS2008C4275警告

警告C4275编译我的代码时,我得到这样的警告:非的dll接口类“的std :: runtime_error”作为基础的dll接口类“MyException” 2> C:\ Program Files文件(x86)的\微软的Visual Studio 9.0 \ VC \包括\ stdexcept(148):看 '的std :: runtime_error' 的声明

我的类定义为

class MyException : public std::runtime_error 

回答

15

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

“导出的类[如在DLL中]是从未导出的类派生的[如DLL]。”

显然你声明MyException可以从DLL中导出(使用:__declspec(dllexport)),而std::runtime_error是不可导出的。考虑MyException是否真的需要导出。但是,如果上述页面上列出的问题都不适用于您的具体情况,那么您可以忽略该警告 - 只需注意问题即​​可。

+1

从上面链接的页面:“如果您从标准C++库中的类型派生,C4275可以在Visual C++中忽略”。你是从'std :: runtime_error'派生的,因此你可以忽略这个警告。 – mbdevpl 2015-09-27 08:22:38

0

我在这里找到了解决同一问题的答案。我有一个从std :: runtime_error派生的自定义异常,并从我的dll导出它。

对于例外情况,似乎最简单的解决方案是不导出派生类。如果将实现从源(.CPP)文件移动到标头(.HPP)中,则可以执行此操作。对我而言,这是微不足道的。我想在大多数情况下,这是例外情况。

这是一件“好事”,因为客户端实际编译和链接自定义异常的实现与他们的std :: runtime_error的实现。这就是你想要的,事实上,C4275警告试图保护你:两个std :: runtime_exception对象类型之间的运行时不兼容。