【发布时间】:2026-02-23 11:05:02
【问题描述】:
移动std::unique_ptr<...>() 的语法让我有些摸不着头脑,我找不到明确的答案(至少对我来说),关于我应该如何移动 unique_ptr。
我有一些堆分配节点并想创建新节点,其中有两个已经存在的节点作为子节点。依次应该将其插入向量中。
#include <memory>
#include <vector>
template <typename T>
struct Node{
std::unique_ptr<Node<T>> left, right;
Node(std::unique_ptr<Node<T>> left, std::unique_ptr<Node<T>> right){
this->left = left;
this->right = right;
}
}
template <typename T>
void foo(){
std::vector<std::unique_ptr<Node<T>>> vec;
//...
vec.insert(vec.begin() + idx, std::unique_ptr<Node<T>>(new Node<T>(vec.at(vec.begin() + idx), vec.at(vec.begin() + idx + 1))));
}
我只收到错误消息,没有找到匹配的函数调用。
expression.hpp:69:58: error: no matching function for call to ‘std::vector<std::unique_ptr<Node<int>, std::default_delete<Node<int> > >, std::allocator<std::unique_ptr<Node<int>, std::default_delete<Node<int> > > > >::at(__gnu_cxx::__normal_iterator<std::unique_ptr<Node<int>, std::default_delete<Node<int> > >*, std::vector<std::unique_ptr<Node<int>, std::default_delete<Node<int> > >, std::allocator<std::unique_ptr<Node<int>, std::default_delete<Node<int> > > > > >)’
谁能帮忙,或者有一个想法,我可以在哪里寻找正确的语法,我应该使用哪个移动/复制功能?
【问题讨论】:
-
请附上minimal reproducible example 和错误信息
-
从语义 POV 来看:手术后谁应该是那个唯一实例的所有者?
-
std::vector的at成员函数采用整数(技术上是size_t)而不是迭代器,所以我认为您可以直接在调用中使用 idx 和 idx + 1到at。这不是关于语法,而是关于类型。我怀疑你的错误信息说明了很多。 -
所有者应该是新节点@πάνταῥεῖ
-
@user463035818 做到了,希望这样会更好
标签: c++ vector unique-ptr