dll中的c-std :: unique_ptr pimpl生成C4251与visual studio
这不是一个突破性的问题,但我喜欢清理我的代码从警告,所以这是我的神经.
我一直在使用c11版本的pimpl成语,以通常的方式隐藏我的库的类实现. // dll header class FrameworkImpl; class EXPORT_API Framework { Framework(const Framework&) = delete; Framework& operator=(const Framework&) = delete; Framework(Framework&&) = delete; Framework& operator=(Framework&&) = delete; public: Framework(); ~Framework(); private: std::unique_ptr<FrameworkImpl> impl_; }; // application implementation int main() { std::unique_ptr<Framework> test = std::make_unique<Framework>(); } 一切都会好起来的,但我会不断得到警告: warning C4251: 'Framework::impl_': class 'std::unique_ptr<FrameworkImpl,std::default_delete<_Ty>>' needs to have dll-interface to be used by clients of class 'Framework' 所以我试过添加: template class EXPORT_API std::unique_ptr<FrameworkImpl>; 在向前宣布之前,警告只会改为: warning C4251: 'std::_Unique_ptr_base<_Ty,_Dx>::_Mypair': class 'std::_Compressed_pair<_Dx,FrameworkImpl *,true>' needs to have dll-interface to be used by clients of class 'std::_Unique_ptr_base<_Ty,_Dx>' 自VS2010以来我一直在看这个问题,我无法找出解决这个问题的好办法.没有问题在gcc或clang,它会打破我的心脏使用旧的原始指针版本..
这是DLL类的一个很常见的问题,它使用std的模板.
为什么会这样呢? 原因很简单:标准只规定了保证,限制和要求.所以你可以肯定的是,每个C11编译器都将提供std :: unique_ptr,它看起来像on this page所描述的那样工作,但其他一切都是依赖于实现的. 主要的问题是,不同的实现可能(并且通常会)对特定类型使用完全不同的结构.他们使用额外的帮助变量,不同的布局等等.即使在同一编译器的两个版本之间也可能有所不同.因此,如果客户端代码以任何方式触发您的类的成员变量,则需要为它们提供DLL接口.这可以递归地应用于dllexported类使用的所有类型. 您可能想要阅读this article on MSDN,介绍容器的这个问题. 这个问题可以简化如下: >如果客户端代码无法访问您的数据,请禁用此警告. 进一步阅读: > MSDN: How to export an instantiation of a STL class (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- active-directory – 将Office 365用户拉到Active Director
- Windows Phone 7 – 如何在WIndows Phone应用程序中访问Nav
- windows – 网络打印机离线(但不是真的)
- windows下mysql的安装到使用
- 将TForm win32 app转换为Win7小工具(delphi)
- Windows中的文本编辑器是否有实时更新?
- Windows Server 2016-Windows 时间服务概览
- windows-server-2008-r2 – Windows 2008 R2如何运行32位应
- 什么是MSVC DLL,静态库和导入库的正确命名约定
- go – uint64是否需要8个字节的存储空间?
- Windows-to-linux:使用SSH和私钥/公钥对的Putty
- xaml – 如何在关闭时为SettingsFlyout设置动画
- windows-xp – 为什么Windows(文件)资源管理器尝
- windows – Delphi – 如何防止窗体/ MsgBoxes在
- windows-server-2008 – 如何在Windows Server 2
- Windows – IIS自签名证书故障 – “参数不正确”
- wmi – 在Win8上发现并启用/禁用设备?
- 如何让“tail -f”处理位于Windows共享上的文件
- Windows上的Google App Engine PHP
- 从我的Windows10到我的docker容器中找到我的ssh密