当前位置: 首页 > 知识库问答 >
问题:

将STD::UNIQUE_PTR作为参数传递的C++

太叔涵亮
2023-03-14

代码如下:

#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>&)[with_tp=bintreenode;_dp=std::default_delete>]“tree.insert(tree.root,10);^

bintree.cpp:在'void bintree::insert(std::unique_ptr>,T)[with T=int]':bintree.cpp:65:27:required from the bintree:40:47:错误:使用删除函数'std::unique_ptr<_tp,_dp>::unique_ptr(const std::unique_ptr<_tp,_dp>&)[with_tp=bintreenode;_dp=std::default_delete>]'
如果(node->data^

在文件included from/usr/include/c++/4.9/memory:81:0,from 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(^)

bintree.cpp:41:30:错误:使用已删除函数'std::unique_ptr<_tp,_dp>::unique_ptr(常量std::unique_ptr<_tp,_dp>&)[with_tp=bintreenode;_dp=std::default_delete>]“else insert(节点->left,key);^

在文件included from/usr/include/c++/4.9/memory:81:0,from 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]“void bintree::insert(

共有1个答案

宋铭
2023-03-14

该错误是由于您试图从tree.root中复制构造bintree::insert的参数造成的。std::unique_ptr是仅限移动的。

我的猜测是,bintree::insert中的节点应该通过引用传递。理由:

  1. 您必须std::tree.root移动到其中(如果通过值传递),这将窃取所有权
  2. 您在bintree::insert中对其进行移动分配,这些更改不是为了传递tree.root
 类似资料:
  • 我有下面的函数声明: 我有另一个函数,我想添加一个< code>std::function作为参数: 然而,我不知道该如何称呼它,或者说我上面的定义是否正确: 编译器错误: 有什么想法吗?

  • 代码如下(为简洁起见摘录): 颜色h: 颜色cpp: 我得到以下错误: 颜色cpp:16:29:错误:传递“const std::map” 错误指的是“返回颜色[cColortype];”在getColorText中。 我写这篇文章是为了一个类项目,我可以通过删除getColorText签名中的const声明来让它工作,但我正在尝试学习/采用良好的实践,并遵循建议,在不修改数据的成员函数中使用co

  • 问题内容: 我有3类调用,和。 在我的课程中,我想要一个这样的方法: 因此,例如,我想: 如何将类名作为参数,并基于该类名从类名创建适当的对象? 问题答案: 使用反射是可能的。这里是给定的className(作为字符串传递)。此类将在内存中搜索(应该已经加载)。 作为字符串传递时要实例化的类的名称应 完全限定

  • 我有一个简单的方法,我想把片段名作为参数传递。我几乎没有像这样的碎片 1) AddNewDatesFragment 2) AskFragment 3)免责声明片段 我有下面的代码可以正常工作 我想在方法中编写一些代码,在这里我可以调用这样的方法 等 我曾经尝试过这样的代码,但在if条件下不工作会导致编译时错误。 我对实施这种方法感到好奇。谢谢

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。