dll中的c-std :: unique_ptr pimpl生成C4251与visual studio

前端之家收集整理的这篇文章主要介绍了dll中的c-std :: unique_ptr pimpl生成C4251与visual studio前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这不是一个突破性的问题,但我喜欢清理我的代码从警告,所以这是我的神经.

我一直在使用c11版本的pimpl成语,以通常的方式隐藏我的库的类实现.

  1. // dll header
  2. class FrameworkImpl;
  3.  
  4. class EXPORT_API Framework
  5. {
  6. Framework(const Framework&) = delete;
  7. Framework& operator=(const Framework&) = delete;
  8. Framework(Framework&&) = delete;
  9. Framework& operator=(Framework&&) = delete;
  10.  
  11. public:
  12. Framework();
  13. ~Framework();
  14.  
  15. private:
  16. std::unique_ptr<FrameworkImpl> impl_;
  17. };
  18.  
  19. // application implementation
  20. int main()
  21. {
  22. std::unique_ptr<Framework> test = std::make_unique<Framework>();
  23. }

一切都会好起来的,但我会不断得到警告:

  1. 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'

所以我试过添加

  1. template class EXPORT_API std::unique_ptr<FrameworkImpl>;

在向前宣布之前,警告只会改为:

  1. 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,介绍容器的这个问题.

这个问题可以简化如下:

>如果客户端代码无法访问您的数据,请禁用此警告.
>如果您有成员,这是客户端代码使用的,创建包装器,即使用dllexported或使用带有dllexported方法的其他间接方法.
>通常,您可以使用PIMPL隐藏非DLL类型,但在您的情况下,它不适用,因为您使用不可导出类型来实际实现PIMPL.

进一步阅读:

> MSDN: How to export an instantiation of a STL class
> Microsoft DLL export and C++ templates
> SO: Exporting classes containing std:: objects from a dll
> SO: How to use an exported class in an STL template?

猜你在找的Windows相关文章