【问题标题】:C++ passing std::unique_ptr as an argumentC++ 将 std::unique_ptr 作为参数传递
【发布时间】:2016-03-31 00:18:15
【问题描述】:

我尝试使用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: 错误: 初始化参数 1'void BinTree::insert(std::unique_ptr >, T) [with T = int]' 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 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: 错误: 初始化参数 1'void BinTree::insert(std::unique_ptr >, T) [with 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::default_delete >]' else insert(node->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&) = 删除; ^

BinTree.cpp:35:6: 错误: 初始化参数 1'void BinTree::insert(std::unique_ptr >, T) [with T = int]' void BinTree::insert(

【问题讨论】:

  • 您忘记告诉我们错误。发生了什么 ?复制粘贴任何输出/错误,以便所有人都能看到。
  • std::unique_ptr 只能移动。

标签: c++ unique-ptr


【解决方案1】:

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

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

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

【讨论】:

  • @tomtom,确保您了解那里实际发生的情况。虽然 LogicStuff 在他们的猜测中可能是正确的,但我不确定您是否完全理解其中的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多