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

时间:2015-12-24 15:11:09

标签: c++ unique-ptr

我尝试使用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&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,   _Dp&gt;&amp;)[with _Tp = BinTreeNode; _Dp = std :: default_delete&gt;]'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&amp;)= delete;          ^

     

BinTree.cpp:35:6:错误:初始化'void的参数1   BinTree :: insert(std :: unique_ptr&gt;,T)[与T =   int]'void BinTree :: insert(         ^

     

BinTree.cpp:实例化'void   BinTree :: insert(std :: unique_ptr&gt;,T)[与T =   int]':BinTree.cpp:65:27:从这里需要BinTree.cpp:40:47:   错误:使用已删除的函数'std :: unique_ptr&lt; _Tp,   _Dp&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,_Dp&gt;&amp;)[with _Tp = BinTreeNode; _Dp = std :: default_delete&gt;]'
  if(node-&gt; data&lt; key)insert(node-&gt; 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&amp;)= delete;          ^

     

BinTree.cpp:35:6:错误:初始化'void的参数1   BinTree :: insert(std :: unique_ptr&gt;,T)[与T =   int]'void BinTree :: insert(         ^

     

BinTree.cpp:41:30:错误:使用已删除的功能   'std :: unique_ptr&lt; _Tp,_Dp&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,   _Dp&gt;&amp;)[with _Tp = BinTreeNode; _Dp = std :: default_delete&gt;]'else insert(node-&gt; left,   键);                                 ^

     

在/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&amp;)= delete;          ^

     

BinTree.cpp:35:6:错误:初始化'void的参数1   BinTree :: insert(std :: unique_ptr&gt;,T)[与T =   int]'void BinTree :: insert(

1 个答案:

答案 0 :(得分:4)

错误是由您尝试从BinTree::insert复制构造tree.root的参数引起的。 std::unique_ptr仅限移动。

我的猜测是node中的BinTree::insert应该通过引用传递。原因:

  1. 您必须std::move tree.root进入BinTree::insert(如果按值传递),这将窃取所有权
  2. 您正在tree.root移动分配给它,这些更改未通过{{1}}