gpt4 book ai didi

c++ - 如何使用 Visual Studio 在 dll 导出类中使用唯一指针 vector

转载 作者:可可西里 更新时间:2023-11-01 16:34:22 25 4
gpt4 key购买 nike

一个简单的例子

class __declspec(dllexport) A
{
public:
vector<unique_ptr<int>> v;
};

VS2013 编译错误 unique_ptr 的已删除复制构造函数.如果我删除 __declspec(dllexport) , 没事。如果我只使用 unique_ptr<int> v ,也很好。这是编译器错误吗?有什么办法可以解决吗?谢谢。

您可以在 http://webcompiler.cloudapp.net/ 上试用完整代码如下

#include <iostream>
#include <vector>
#include <memory>
using namespace std;

class __declspec(dllexport) A
{
public:
vector<unique_ptr<int>> v;
};

int main()
{
cout << "Hello World" << endl;
}

产生编译器错误:

Compiled with /EHsc /nologo /W4 /c
main.cpp
main.cpp(9): warning C4251: 'A::v': class 'std::vector<std::unique_ptr<int,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>' needs to have dll-interface to be used by clients of class 'A'
with
[
_Ty=int
]
c:\tools_root\cl\inc\xutility(2144): error C2280: 'std::unique_ptr<int,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
with
[
_Ty=int
]
c:\tools_root\cl\inc\memory(1430): note: see declaration of 'std::unique_ptr<int,std::default_delete<_Ty>>::operator ='
with
[
_Ty=int
]
c:\tools_root\cl\inc\xutility(2165): note: see reference to function template instantiation '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled
with
[
_OutIt=std::unique_ptr<int,std::default_delete<int>> *,
_InIt=std::unique_ptr<int,std::default_delete<int>> *
]
c:\tools_root\cl\inc\vector(973): note: see reference to function template instantiation '_OutIt std::_Copy_impl<std::unique_ptr<int,std::default_delete<_Ty>>,std::unique_ptr<_Ty,std::default_delete<_Ty>>*>(_InIt,_InIt,_OutIt)' being compiled
with
[
_OutIt=std::unique_ptr<int,std::default_delete<int>> *,
_Ty=int,
_InIt=std::unique_ptr<int,std::default_delete<int>> *
]
c:\tools_root\cl\inc\vector(956): note: while compiling class template member function 'std::vector<std::unique_ptr<int,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>> &std::vector<std::unique_ptr<_Ty,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::operator =(const std::vector<std::unique_ptr<_Ty,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>> &)'
with
[
_Ty=int
]
main.cpp(10): note: see reference to function template instantiation 'std::vector<std::unique_ptr<int,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>> &std::vector<std::unique_ptr<_Ty,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::operator =(const std::vector<std::unique_ptr<_Ty,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>> &)' being compiled
with
[
_Ty=int
]
main.cpp(9): note: see reference to class template instantiation 'std::vector<std::unique_ptr<int,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>' being compiled
with
[
_Ty=int
]

最佳答案

似乎在添加 __declspec(dllexport)强制编译器定义隐式声明的复制构造函数和复制赋值运算符(通常,只有在使用它们时才会发生)。这些依次调用 v 的复制构造函数/赋值运算符。 .但是std::vector<T>的复制操作对于不可复制的 T 格式错误,例如 std::unique_ptr .因此错误。

当成员(member)刚好是std::unique_ptr时,问题不会发生,因为它明确删除了复制操作,因此 A 的默认复制操作也被删除。

因此,如果您显式删除复制操作,问题就解决了:

class __declspec(dllexport) A
{
public:
A(const A&) = delete;
A& operator=(const A&) = delete;
vector<unique_ptr<int>> v;
};

当然,如果您想要复制功能,您自己定义它们也会有所帮助。

关于c++ - 如何使用 Visual Studio 在 dll 导出类中使用唯一指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29565299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com