首页 > 解决方案 > 具有 unique_ptr 的结构向量

问题描述

我已经阅读了许多类似问题的答案,但仍然找不到我的问题的解决方案。

我有结构:

struct Param {
    std::string name;
    std::unique_ptr<Object> default_val;
};

我有Function一个存储Params向量的类。我在某个地方创建了这个参数的向量,并需要将它传递给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&)'

标签: c++c++11memoryc++17unique-ptr

解决方案


Param不可复制,因为其中一个成员不可复制。由于向量与其内容一样可复制,因此向量Param不可复制。

当你这样做时:

Callable(const Params & params) : params(params) {}

您正在尝试使用向量的复制构造函数。那不会编译。

您需要移动输入向量,这将同时移动其内容。这意味着更改构造函数,使其采用右值引用,并std::move用于移动向量。

Callable(Params&& params) : params(std::move(params)) {}

推荐阅读