【问题标题】:Vector of structs with unique_ptr具有 unique_ptr 的结构向量
【发布时间】:2020-10-25 23:31:42
【问题描述】:

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

我有结构:

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

我有一个类Function,它存储了一个Params 的向量。 我在某处创建了这个参数的向量并需要将其传递给Function 构造函数。

问题出在我试图将向量传递给构造函数的那一刻。 我知道我需要移动所有unique_ptrs,我做到了。

也许我错过了一些非常简单的事情?

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&amp;)'

【问题讨论】:

  • 你还没有真正说出你的问题是什么。出了什么问题?请同时标记给出错误的确切行。
  • @cigien,对不起,我编辑了
  • 尝试添加一个移动构造函数Callable(Params &amp;&amp; params) 然后我认为它们将被移动(它将使用Param(const Param&amp;)退出
  • 您在哪一行得到错误? default_val 的类型是什么?能否提供minimal reproducible example!?
  • 另外,使用emplace_back 而不是push_back

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


【解决方案1】:

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

当你这样做时:

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

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

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

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

【讨论】:

  • 谢谢。我已经尝试过了,但我害怕另一件事。但这是正确的解决方案。
  • @hazer_hazer 如果您尝试了正确的解决方案但没有成功,您应该询问相关问题。
  • 不,这行得通,但我也有clone 方法的问题,它只是创建Callable 的副本,它接收params 这是左值,但std::move 没有t 工作,所以我很害怕并回到以前的版本:) 对不起,如果这听起来不专业,我不太擅长 c++
  • clone 方法是virtual in Object 并在后代中实现,对吧?
  • @TedLyngmo,别介意,我已经解决了所有问题。谢谢大家
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多