【问题标题】:How to export class containing `std::map` property with `std::unique_ptr` values如何使用 `std::unique_ptr` 值导出包含 `std::map` 属性的类
【发布时间】:2019-04-07 23:05:01
【问题描述】:

我有一个带有 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 类,我应该怎么做?

【问题讨论】:

  • 谢谢,如果答案足够简洁,请告诉我。

标签: c++ visual-c++ dll


【解决方案1】:

当 Visual Studio 需要导出一个类时,它会实例化所有可能的东西。如果它们没有被显式删除,它也会尝试创建一个复制构造函数和复制赋值运算符。

很遗憾,成员变量info 因为唯一指针而无法复制。因此,当它尝试导出类时,它会失败。

添加:

Cat(const Cat&) = delete;
Cat& operator=(const Cat&) = delete;

到你的类定义。

【讨论】:

  • 听起来比我最初选择的副本更简洁,是的。推理是一样的。
  • 确实,它们可能很相似。谢谢你检查我的答案。
  • NP,我在这里为您服务 :)
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多