首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将std::unique_ptr作为参数传递的C++

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

Stack Overflow用户
提问于 2015-12-24 23:11:09
回答 1查看 1.7K关注 0票数 3

我试图用std::unique_ptr实现二叉树,但是出现了错误,我不能理解输出的错误。

代码如下:

代码语言:javascript
复制
#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);
}

我假设错误是在insert函数中,与参数初始化有关。

BinTree.cpp:65:27:错误:使用已删除的函数‘std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&),_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:错误:使用T=int初始化‘void BinTree::insert( ^)’void BinTree::insert(std::unique_ptr >,T)的参数%1

BinTree.cpp:在‘void二叉树::insert(std::unique_ptr >,T) with T=int’的实例化中: BinTree.cpp:65:27:此处需要BinTree.cpp:40:47: error:使用已删除的函数‘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:错误:使用T=int初始化‘void BinTree::insert( ^)’void BinTree::insert(std::unique_ptr >,T)的参数%1

BinTree.cpp:41:30:错误:使用删除的函数‘std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&),_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&) = delete;^

BinTree.cpp:35:6:错误:使用T=int‘void BinTree::insert( )初始化’void BinTree::insert(std::unique_ptr >,T)的参数1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 23:17:24

该错误是由于您试图从tree.root复制构造BinTree::insert的参数而导致的。std::unique_ptr是仅移动的。

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

如果是通过值传递的话,你必须把

  1. std::move到它里面(如果通过值传递的话),这会窃取tree.root --在BinTree::insert中赋值给它,这些修改不是为了传递tree.root

而做的

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34454723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档