C++传递std::unique_ptr作为参数
C++ passing std::unique_ptr as an argument
我试图使用std::unique_ptr
实现二进制树,但出现了错误,我不理解输出错误。
代码如下:
#include <iostream>
#include <memory>
#include <functional>
#include <utility>
template <typename T>
class BinTreeNode {
public:
BinTreeNode(T key): data {key}, left {nullptr}, right {nullptr} {}
~BinTreeNode() {}
T data;
std::unique_ptr<BinTreeNode<T>> left;
std::unique_ptr<BinTreeNode<T>> right;
};
template <typename T>
class BinTree {
public:
BinTree() : root {nullptr} {}
~BinTree() {}
std::unique_ptr<BinTreeNode<T>> root;
void insert(std::unique_ptr<BinTreeNode<T>> node, T key);
};
template <typename T>
void BinTree<T>::insert(
std::unique_ptr<BinTreeNode<T>> node,
T key)
{
if(node){ // != nullptr
if(node->data < key) insert(node->right, key);
else insert(node->left, key);
}
else{
std::unique_ptr<BinTreeNode<T>> u_ptr(new BinTreeNode<T>(key));
node = std::move(u_ptr);
}
}
int main(){
BinTree<int> tree();
tree.insert(tree.root, 10);
}
我认为错误在插入函数中,并且与参数初始化有关。
BinTree.cpp:65:27:错误:使用已删除的函数'std::unique_ptr<_Tp、_Dp>::unique_ptr(const std::unique_pr<_Tp,_Dp>&)[with_Tp=BinTreeNode;_Dp=std::default_delete>]'树插入(tree.root,10);^
在/usr/include/c++/4.9/mestory:81:0中包含的文件中,from BinTree.cpp:2:/usr/include/c++/4.9/bits/unique_ptr.h:356:7:注意:在此处声明unique_ptr(const unique_ptr&)=删除;^
BinTree.cpp:35:6:错误:初始化"void"的参数1BinTree::insert(std::unique_ptr>,T)[带T=int]'void BinTree::insert(^
BinTree.cpp:在"void"的实例化中BinTree::insert(std::unique_ptr>,T)[带T=int]':BinTree.cpp:65:27:从这里开始需要BinTree.cpp:40:47:错误:使用已删除的函数'std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_pr<_Tp,_Dp>&)[带有_Tp=BinTreeNode;_Dp=std::default_delete>]'
如果(node->data<key)插入(node->right,key);^在/usr/include/c++/4.9/mestory:81:0中包含的文件中,from BinTree.cpp:2:/usr/include/c++/4.9/bits/unique_ptr.h:356:7:注意:在此处声明unique_ptr(const unique_ptr&)=删除;^
BinTree.cpp:35:6:错误:初始化"void"的参数1BinTree::insert(std::unique_ptr>,T)[带T=int]'void BinTree::insert(^
BinTree.cpp:41:30:错误:使用已删除的函数'std::unique_ptr<_Tp、_Dp>::unique_ptr(const std::unique_pr<_Tp,_Dp>&)[with_Tp=BinTreeNode;_Dp=std::default_delete>]'else insert(node->left,密钥);^
在/usr/include/c++/4.9/mestory:81:0中包含的文件中,from BinTree.cpp:2:/usr/include/c++/4.9/bits/unique_ptr.h:356:7:注意:在此处声明unique_ptr(const unique_ptr&)=删除;^
BinTree.cpp:35:6:错误:初始化"void"的参数1BinTree::insert(std::unique_ptr>,T)[带T=int]'void BinTree::insert(
错误是由您试图从tree.root
复制构造BinTree::insert
的参数引起的。std::unique_ptr
仅移动。
我的猜测是BinTree::insert
中的node
应该通过引用传递。原因:
- 您必须将
std::move
和tree.root
放入其中(如果按值传递),这将窃取所有权 - 您正在
BinTree::insert
中移动分配给它,这些更改不会通过tree.root
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 如何使用非类型参数传递模板化类的 Ref 或 Ptr
- 视觉 C++编译器在计算其参数之前是否允许将函数 ptr 存储在寄存器中?
- 如何调用传递的函数(函数 ptr 作为参数传递给函数)
- 为什么非常量ptr不能隐式地将ptr转换为常量作为模板中的参数
- 二进制泛型lambda不匹配ptr-to-function参数
- 分配const char *ptr数组参数?c++
- 函数PTR转换为带模板参数的函数
- ptr到成员模板参数的友元语法
- 将字符串引用作为参数传递时Ptr错误