我试图从包含std :: vectors和std :: strings等对象的DLL导出类 - 整个类通过以下方式声明为dll导出:
class DLL_EXPORT FontManager
{
Run Code Online (Sandbox Code Playgroud)
问题是,对于复杂类型的成员,我收到此警告:
警告C4251:'FontManager :: m__fonts':类'std :: map <_Kty,_Ty>'需要让'FontManager'类的客户端使用dll接口[_Kty = std :: string,_Ty = tFontInfoRef ]
我可以通过在它们之前放置以下前向类声明来删除一些警告,即使我没有更改成员变量本身的类型:
template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>;
template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >;
std::vector<tCharGlyphProviderRef> m_glyphProviders;
Run Code Online (Sandbox Code Playgroud)
看起来像前导声明"注入"DLL_EXPORT编译成员时,它是否安全?当客户端编译此标头并使用他身边的std容器时,它是否真的会改变任何东西?它是否会在将来使用这样的容器DLL_EXPORT(并且可能不是内联的?)?它是否真的解决了警告试图警告的问题?
这个警告是我应该担心的,还是最好在这些结构的范围内禁用它?客户端和dll将始终使用相同的库和编译器集构建,并且这些只是标题类...
我正在使用Visual Studio 2003和标准STD库.
----更新----
我想更多地针对你,因为我看到答案是一般性的,这里我们讨论的是std容器和类型(例如std :: string) - 也许问题确实是:
我们是否可以通过相同的库标题禁用客户端和dll可用的标准容器和类型的警告,并像处理int或任何其他内置类型一样处理它们?(它确实似乎在我身边正常工作.)如果可以,我们可以做到这一点的条件是什么?
或者应该禁止使用这样的容器,或者至少要特别小心,以确保没有赋值操作符,复制构造函数等内联到dll客户端?
一般来说,我想知道你是否觉得设计一个具有这些对象的dll接口(例如使用它们将东西作为返回值类型返回到客户端)是一个好主意或不是,为什么 - 我想要这个功能的"高级"接口......也许最好的解决方案是Neil Butterworth建议的 - 创建一个静态库?
这是我在这个小组中的第一篇文章.
我正在创建一个DLL并在应用程序的主文件中调用它.代码编译正常,但我收到以下错误:
warning C4251: 'PNCBaseClass::m_vAvailChannelsFromRx' : class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'PNCBaseClass'
3> with
3> [
3> _Ty=int
3> ]
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
#define TEST_API __declspec(dllexport)
class TEST_API PNCBaseClass
{
public:
vector<int> m_vAvailChannelsFromRx
};
Run Code Online (Sandbox Code Playgroud)
我已经找到了解决方案并尝试并失败了.
我不想禁用警告.