gpt4 book ai didi

c++ - 错误 : call to implicitly-deleted copy constructor of unique_ptr

转载 作者:行者123 更新时间:2023-12-05 09:26:10 32 4
gpt4 key购买 nike

我正在尝试创建一个指向 <Node> 的唯一指针类型变量:

#include <memory>

struct Node
{
int val;
std::unique_ptr<Node> next;

Node(int value, std::unique_ptr<Node> nextNode) : val(value), next(std::move(nextNode)){};
}

int main()
{
Node headNode = Node(1, nullptr);
std::unique_ptr<Node> head = std::make_unique<Node>(headNode);

return 0;
}

当我编译这段代码时,出现了以下错误:

error: call to implicitly-deleted copy constructor of 'Node'
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in instantiation of function template specialization 'std::make_unique<Node, Node &>' requested here
std::unique_ptr<Node> head = std::make_unique<Node>(headNode);
^
note: copy constructor of 'Node' is implicitly deleted because field 'next' has a deleted copy constructor
std::unique_ptr<Node> next;
^
note: copy constructor is implicitly deleted because 'unique_ptr<Node>' has a user-declared move constructor
unique_ptr(unique_ptr&& __u) _NOEXCEPT

最佳答案

std::make_unique<Node>(headNode);

这通过尝试从另一个 Node 复制构造它来构造一个唯一的 Node

std::unique_ptr 根据定义是不可复制的(这是由于“unique_ptr”的“独特”部分)。这意味着任何包含 std::unique_ptr 的类在默认情况下都是不可复制的,并且它的默认复制构造函数被删除。

这就是你编译错误的原因。如果不涉及 std::unique_ptr,您会得到相同的编译错误:

Node node2{headNode};

这会导致相同的编译错误。您有两个选择:

  1. Node 实现一个复制构造函数,它会执行任何对复制构造您的 Node 有意义的结果。

  2. 以某种方式重新设计您的代码,避免复制构造 Node

如果您描述的目标是“指向类型变量的唯一指针”,那么这不需要复制构造它,只需:

std::unique_ptr<Node> head = std::make_unique<Node>(1, nullptr);

关于c++ - 错误 : call to implicitly-deleted copy constructor of <T> unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74175542/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com