c++ - ThreadSafeModule 构造函数异常
问题描述
当我ThreadSafeModule
有一个Module*
. 我查了一下ThreadSafeModule
,它有这些构造函数:
ThreadSafeModule(ThreadSafeModule &&Other) = default;
/// Construct a ThreadSafeModule from a unique_ptr<Module> and a
/// unique_ptr<LLVMContext>. This creates a new ThreadSafeContext from the
/// given context.
ThreadSafeModule(std::unique_ptr<Module> M, std::unique_ptr<LLVMContext> Ctx)
: M(std::move(M)), TSCtx(std::move(Ctx)) {}
/// Construct a ThreadSafeModule from a unique_ptr<Module> and an
/// existing ThreadSafeContext.
ThreadSafeModule(std::unique_ptr<Module> M, ThreadSafeContext TSCtx)
: M(std::move(M)), TSCtx(std::move(TSCtx)) {}
第二个或第三个似乎合适,所以我尝试了几种变体:
ThreadSafeContext tsc;
ThreadSafeModule tsm(*module, tsc);
ThreadSafeModule tsm(module, tsc);
ThreadSafeModule tsm(std::move(*module), tsc);
ThreadSafeModule tsm(std::move(module), tsc);
auto tsm = new ThreadSafeModule(*module, tsc);
auto tsm = new ThreadSafeModule(module, tsc);
上面用 aLLVMContext*
而不是 a ThreadSafeContext
,在所有情况下我都会收到基本相同的错误消息:
jit.cpp(21): error C2664: 'llvm::orc::ThreadSafeModule::ThreadSafeModule(const llvm::orc::ThreadSafeModule &)': cannot convert argument 1 from 'llvm::Module *' to 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>'
with
[
_Ty=llvm::Module
]
jit.cpp(21): note: Constructor for class 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>' is declared 'explicit'
with
[
_Ty=llvm::Module
]
错误消息的第一部分似乎是说由于某种原因试图调用复制构造函数,但这似乎与下一部分相矛盾。
知道这是怎么回事,正确的咒语是什么?
编辑:
就其而言,单独的行有效:
std::unique_ptr<Module> up(module);
但这仍然失败:
ThreadSafeModule tsm(up, tsc);
错误消息略有不同:
jit.cpp(23): error C2280: 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
with
[
_Ty=llvm::Module
]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\memory(2337): note: see declaration of 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>::unique_ptr'
with
[
_Ty=llvm::Module
]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\memory(2337): note: 'std::unique_ptr<llvm::Module,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': function was explicitly deleted
with
[
_Ty=llvm::Module
] (compiling source file jit.cpp)
解决方案
感谢 #llvm 上的 preejackie 的回答:原来unique_ptr
必须单独构建然后移动:
std::unique_ptr<Module> up(module);
ThreadSafeModule tsm(std::move(up), tsc);
推荐阅读
- rust - 从 Rust 中的不可变访问器返回 &String 与 &str
- machine-learning - 我可以在 AWS 以外的平台上外部使用开源 Sagemaker-Neo (neo-ai-dlr) 吗?
- android-sqlite - 关于 INNER 连接的 SQLite 数据库查询问题
- php - 如何与 apache 服务器并行运行棘轮 websocket 服务器
- flutter - 如果条件在容器颤振中运行小部件
- angular - 提交后表单中未捕获 mat-form-field 中的值
- hyperledger-fabric - 超级账本中的节点如何验证交易?
- javascript - 如何删除对象以使用 mongodb?
- python - 如何将 Shift-Click 选项添加到按钮
- r - GGPLOT 中的条件误差条未分配。即使条件为真,也未分配错误栏