C++ 是::vector<;标准::唯一性\u ptr<;用户定义类型>&燃气轮机;可能的

C++ 是::vector<;标准::唯一性\u ptr<;用户定义类型>&燃气轮机;可能的,c++,stl,unique-ptr,dllexport,C++,Stl,Unique Ptr,Dllexport,我正在尝试导出一个具有私有成员的类std::vector。dll客户端应该使用Number对象,所以我实例化了它。但现在我遇到了一个编译器错误: error C2280: 'std::unique_ptr<Number,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to re

我正在尝试导出一个具有私有成员的类
std::vector
。dll客户端应该使用
Number
对象,所以我实例化了它。但现在我遇到了一个编译器错误:

error C2280: 'std::unique_ptr<Number,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
1>          with
1>          [
1>              _Ty=Number
1>          ]
错误C2280:'std::unique_ptr::unique_ptr(const std::unique_ptr&'):尝试引用已删除的函数
1> 与
1>          [
1> _Ty=数字
1>          ]
这是我的测试代码

class __declspec(dllexport) Number
{
public:
    int i;
};

template class __declspec(dllexport) std::vector<std::unique_ptr<Number>>; // to avoid warning C4251

class __declspec(dllexport) A
{
public:
    A(){}
    ~A(){}
    A(A&&) {}
    A& operator=(A&&) { return *this; }

    Number& getNumber(int i) { return *v[i]; }
private:
    A(const A&);
    A& operator=(const A&);

    std::vector<std::unique_ptr<Number>> v;
};
class\uuu declspec(dllexport)编号
{
公众:
int i;
};
模板类uu declspec(dllexport)std::vector;//避免警告C4251
类declspec(dllexport)A
{
公众:
A(){}
~A(){}
A(A&&{}
A&运算符=(A&&){return*this;}
Number&getNumber(inti){return*v[i];}
私人:
A(常数A&);
A&运算符=(常数A&);
std::向量v;
};

UDP=。。。尿苷三磷酸?用户数据报协议?什么?无论如何,在一个DLL中分配内存和在主程序或其他DLL(即其他模块)中释放内存时,你需要非常小心。@Cheerrandhth.-Alf为什么会有问题?@Johanneschaub litb:Windows DLL可以在内部使用任何运行时库。它更像是一个程序,而不是一个库。当运行时库不同,并且导出的对象没有封装并确保使用原始分配器进行释放时,行为是非常未定义的。我使用这个术语松散,因为C++标准不支持DLL:它超出标准的标准。UDP=用户定义类型。我更新了titleUp=。。。尿苷三磷酸?用户数据报协议?什么?无论如何,在一个DLL中分配内存和在主程序或其他DLL(即其他模块)中释放内存时,你需要非常小心。@Cheerrandhth.-Alf为什么会有问题?@Johanneschaub litb:Windows DLL可以在内部使用任何运行时库。它更像是一个程序,而不是一个库。当运行时库不同,并且导出的对象没有封装并确保使用原始分配器进行释放时,行为是非常未定义的。我使用这个术语松散,因为C++标准不支持DLL:它超出标准的标准。UDP=用户定义类型。我更新了标题