我尝试使用实现二叉树,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_ptr <_Tp,_Dp>&)[with _Tp = BinTreeNode; _Dp = std :: default_delete>]'tree.insert(tree.root,10); ^
在/usr/include/c++/4.9/memory:81:0中包含的文件中,从BinTree.cpp:2:/usr/include/c++/4.9/bits/unique_ptr.h:356:7:注意:在此处声明unique_ptr (const unique_ptr&)=删除; ^
BinTree.cpp:35:6:错误:初始化'void BinTree :: insert(std :: unique_ptr>,T)[with T = int]'的参数1 void BinTree :: insert(^
BinTree.cpp:在'void BinTree :: insert(std :: unique_ptr>,T)[with T = int]'的实例中:BinTree.cpp:65:27:从此处需要BinTree.cpp:40:47:错误:使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = BinTreeNode; _Dp = std :: default_delete>]'
if(node-> data <key)insert(node-> right,key); ^在/usr/include/c++/4.9/memory:81:0中包含的文件中,从BinTree.cpp:2:/usr/include/c++/4.9/bits/unique_ptr.h:356:7:注意:在此处声明unique_ptr (const unique_ptr&)=删除; ^
BinTree.cpp:35:6:错误:初始化'void BinTree :: insert(std :: unique_ptr>,T)[with T = int]'的参数1 void BinTree :: insert(^
BinTree.cpp:41:30:错误:使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = BinTreeNode; _Dp = std :: default_delete>]'else insert(node-> left,key); ^
在/usr/include/c++/4.9/memory:81:0中包含的文件中,从BinTree.cpp:2:/usr/include/c++/4.9/bits/unique_ptr.h:356:7:注意:在此处声明unique_ptr (const unique_ptr&)=删除; ^
BinTree.cpp:35:6:错误:初始化'void BinTree :: insert(std :: unique_ptr>,T)[with T = int]'的参数1 void BinTree :: insert(
该错误是由于您尝试复制BinTree::insert
from的参数而引起的tree.root
。std::unique_ptr
仅可移动。
我的猜测是node
inBinTree::insert
应该通过引用传递。原因:
std::move
其tree.root
插入(如果通过值传递),这将窃取所有权BinTree::insert
,这些更改不会通过tree.root
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句