首页 文章

C传递std :: unique_ptr作为参数

提问于
浏览
1

我尝试使用 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&)= delete; ^ BinTree.cpp:35:6:错误:初始化'void BinTree :: insert(std :: unique_ptr>,T)[与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&)= delete; ^ BinTree.cpp:35:6:错误:初始化'void BinTree :: insert(std :: unique_ptr>,T)的参数1 [与T = int]'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 :: defaul t_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&)= delete; ^ BinTree.cpp:35:6:错误:初始化'void BinTree :: insert(std :: unique_ptr>,T)[with T = int]'的参数1'void BinTree :: insert(

1 回答

  • 4

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

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

    • 你必须 std::move tree.root 进入它(如果通过值传递),这将窃取所有权

    • 您在 BinTree::insert 中移动分配给它,这些更改未通过 tree.root

相关问题