C++传递std::unique_ptr作为参数

C++ passing std::unique_ptr as an argument

本文关键字:参数 ptr unique 传递 std C++      更新时间:2023-10-16

我试图使用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&lt_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&lt_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&lt_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应该通过引用传递。原因:

  1. 您必须将std::movetree.root放入其中(如果按值传递),这将窃取所有权
  2. 您正在BinTree::insert中移动分配给它,这些更改不会通过tree.root