c++ - 具有 unique_ptr 的结构向量
问题描述
我已经阅读了许多类似问题的答案,但仍然找不到我的问题的解决方案。
我有结构:
struct Param {
std::string name;
std::unique_ptr<Object> default_val;
};
我有Function
一个存储Param
s向量的类。我在某个地方创建了这个参数的向量,并需要将它传递给Function
构造函数。
问题出在我试图将向量传递给构造函数的那一刻。我知道我需要移动所有unique_ptr
的 s,我做到了。
也许我错过了一些非常简单的东西?
Code snippets
Function
: _
using Params = std::vector<Param>;
class Callable : public Object {
public:
Callable(const Params & params) : params(params) {}
// ...
private:
Params params;
}
我创建向量的代码:
Params params;
for(auto & p : func_decl->params){
auto default_val = eval(p.default_val.get());
Param p(p.id->get_name(), std::move(default_val));
params.push_back(std::move(p));
}
可以不在这里使用shared_ptr
吗?
输出是:
error: use of deleted function 'Param::Param(const Param&)'
解决方案
Param
不可复制,因为其中一个成员不可复制。由于向量与其内容一样可复制,因此向量Param
不可复制。
当你这样做时:
Callable(const Params & params) : params(params) {}
您正在尝试使用向量的复制构造函数。那不会编译。
您需要移动输入向量,这将同时移动其内容。这意味着更改构造函数,使其采用右值引用,并std::move
用于移动向量。
Callable(Params&& params) : params(std::move(params)) {}
推荐阅读
- timestamp - 如何在 Power Bi 中将毫秒转换为 DateTime?
- c# - 如何查找谁订阅了 NetMQ PUB Socket?
- firebase - 流生成器
(脏,状态:_StreamBuilderBaseState >#ac213): - algolia - 如何简化搜索查询参数?
- java - 被底部导航视图隐藏的滚动视图最后的底部内容
- azure - powerShell Azure 函数中的 Connect-PnPOnline 出现 TokenHelper 错误
- javascript - 如何使用自定义表情符号制作反应角色?
- javascript - 当有未分阶段的更改时,如何从“npm install $anything”出错?
- java - java - 如何在Java中使用Google Analytics Data API(GA4)来扩展获取值以获取screenPageViews的计数?
- java - 什么时候在java中打开数据库连接