gpt4 book ai didi

c++ - 如何从 dll 正确返回 std::list

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:22 25 4
gpt4 key购买 nike

该项目具有以下结构:1.dll——具有核心逻辑和类层次结构2. exe - 处理命令行并启动算法的控制台应用程序3. Dll - 测试,就像一个单元测试工具包 - 硬编码填充第一个 Dll 中的对象集合,并将集合传递给 exe 控制台进行处理

所以Dll点3应该返回集合(例如std::list),集合包含多态对象,那么应该存储指针,我更愿意使用 std::unique_ptr 而不是原始指针

我看到 unique_ptr 只支持移动语义,我正在使用 emplace_back 成员填充列表。然而,从与 MSVC 类导出技术相关的 Dll 返回 std::list> 集合时存在问题

如果我理解正确的话:在 dll 和 exe 项目标题之间共享应该包含类似这样的内容,其中 EXP_DLL 应该为 Dll 定义并且为 exe 未定义

 #ifdef EXP_STL
# define DECLSPECIFIER __declspec(dllexport)
# define EXPIMP_TEMPLATE
#else
# define DECLSPECIFIER __declspec(dllimport)
# define EXPIMP_TEMPLATE extern
#endif

EXPIMP_TEMPLATE template class DECLSPECIFIER std::list<std::unique_ptr<MyBassClass>>;

std::list<std::unique_ptr<MyBassClass>> DECLSPECIFIER make_test_array();

这个定义:

 EXPIMP_TEMPLATE template class DECLSPECIFIER std::list<std::unique_ptr<MyBassClass>>;

引发错误

C2280:std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function

我看到试图调用 unique_ptr 的复制 ctor(当然,已删除)

你能为我澄清这些问题吗:

  1. 实例化模板的导出声明如何在这里调用复制构造函数?
  2. 您能否建议如何避免这种情况的解决方案?

最佳答案

假设满足以下条件:

  1. 解决方案中的所有项目都链接相同的运行时 DLL(/MD 选项)
  2. MyBaseClass 类具有 DECLSPECIFIER 属性。
  3. MyBaseClass 类在 make_test_array 声明之前完全定义。

您根本不能导出模板特化。只需删除行 EXPIMP_TEMPLATE template class ... .std::list 和 std::unique_ptr 代码将被内联。您将收到警告 C4251,请忽略它。

当您尝试导出 std::list特化,所有 std::list<T>方法被实例化。其中一些(例如赋值运算符)要求 T 是可复制的。这就是无法编译带有 unique_ptr 的特化的原因。

关于c++ - 如何从 dll 正确返回 std::list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28798175/

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