如何从 dll 中正确 return std::list
how to correctly return std::list from dll
该项目具有以下结构:
1. DLL - 具有核心逻辑和 class 层次结构
2. exe - 处理命令行并启动算法的控制台应用程序
3. Dll - 测试,就像一个单元测试工具包 - 硬编码填充来自第一个 Dll 的项目的 collection 并将 collection 传递给 exe 控制台以处理
所以Dll指向3应该return collection(例如std::list),collection包含多态objects,那么应该存储指针,
我更愿意使用 std::unique_ptr 而不是原始指针
我看到 unique_ptr 仅支持移动语义,我正在使用 emplace_back 成员填充列表。
但是 return std::list> collection 来自与 MSVC class 导出技术
相关的 Dll 存在问题
如果我理解正确的话:
在 dll 和 exe 项目之间共享 header 应该包含类似这样的内容,其中 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(当然,已删除)
你能帮我澄清一下这些问题吗:
- 实例化模板的导出声明如何在这里调用复制ctor?
- 您能否建议如何避免这种情况的解决方案?
假设满足以下条件:
- 解决方案中的所有项目link相同的运行时间DLL(/MD选项)
- Class MyBaseClass 的属性为 DECLSPECIFIER。
- Class MyBaseClass 在 make_test_array 声明之前完全定义。
您绝对不能导出模板专业化。只需删除行 EXPIMP_TEMPLATE template class ...
。
std::list 和 std::unique_ptr 代码将被内联。
您将收到警告 C4251,请忽略它。
当您尝试导出 std::list
专业化时,all std::list<T>
方法被实例化。其中一些(例如赋值运算符)要求 T 是可复制的。这就是无法编译带有 unique_ptr 的特化的原因。
该项目具有以下结构: 1. DLL - 具有核心逻辑和 class 层次结构 2. exe - 处理命令行并启动算法的控制台应用程序 3. Dll - 测试,就像一个单元测试工具包 - 硬编码填充来自第一个 Dll 的项目的 collection 并将 collection 传递给 exe 控制台以处理
所以Dll指向3应该return collection(例如std::list),collection包含多态objects,那么应该存储指针, 我更愿意使用 std::unique_ptr 而不是原始指针
我看到 unique_ptr 仅支持移动语义,我正在使用 emplace_back 成员填充列表。 但是 return std::list> collection 来自与 MSVC class 导出技术
相关的 Dll 存在问题如果我理解正确的话: 在 dll 和 exe 项目之间共享 header 应该包含类似这样的内容,其中 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(当然,已删除)
你能帮我澄清一下这些问题吗:
- 实例化模板的导出声明如何在这里调用复制ctor?
- 您能否建议如何避免这种情况的解决方案?
假设满足以下条件:
- 解决方案中的所有项目link相同的运行时间DLL(/MD选项)
- Class MyBaseClass 的属性为 DECLSPECIFIER。
- Class MyBaseClass 在 make_test_array 声明之前完全定义。
您绝对不能导出模板专业化。只需删除行 EXPIMP_TEMPLATE template class ...
。
std::list 和 std::unique_ptr 代码将被内联。
您将收到警告 C4251,请忽略它。
当您尝试导出 std::list
专业化时,all std::list<T>
方法被实例化。其中一些(例如赋值运算符)要求 T 是可复制的。这就是无法编译带有 unique_ptr 的特化的原因。