我有一个带有Cat
类的库,该库具有属性std :: map info
:
#ifdef LIB_EXPORT
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __declspec(dllimport)
#endif
// Works!
class Dog {
std::map<int, std::unique_ptr<int>> info;
};
// Compile errors
class LIB_API Cat {
std::map<int, std::unique_ptr<int>> info;
};
假设:客户端始终使用相同版本的std :: unique_ptr,并且Cat
实例的内存布局与DLL可能期望的相同。
Dog
类已成功编译,但是Cat
类失败,出现3个错误:
C2280'std :: pair :: pair(const std :: pair&)':尝试引用已删除的函数
我应该怎么做才能导出Cat
类?
答案 0 :(得分:1)
当Visual Studio需要导出类时,它将实例化所有可能的东西。如果未明确删除它们,它还将尝试创建一个复制构造函数和一个复制赋值运算符。
不幸的是,由于具有唯一指针,无法复制成员变量info
。因此,当它尝试导出该类时,它将失败。
添加:
Cat(const Cat&) = delete;
Cat& operator=(const Cat&) = delete;
转到您的班级定义。