单链表推送功能错误

时间:2016-12-23 15:37:46

标签: c++ visual-c++ c++14 unique-ptr

我不知道自己做错了什么,但我遇到推功能问题。你能帮帮我吗?

#include<iostream>
#include<memory>
using namespace std;

struct lista {
    int value;
    unique_ptr<lista>next;

    lista(int value):value(value), next(nullptr){}


};
void push(int x, unique_ptr<lista> &h) {
    unique_ptr<lista>alok_pam_x = make_unique<lista>(x);
    if (alok_pam_x!= nullptr)
    {
        (alok_pam_x->next) = h;
        h = alok_pam_x;

    }

}

我有错误:

  

严重级代码描述项目文件行抑制状态   错误C2280&#39; std :: unique_ptr&gt;   &amp; std :: unique_ptr&lt; _Ty,std :: default_delete&lt; _Ty&gt;&gt; :: operator =(const   的std ::的unique_ptr&LT; _Ty,性病:: default_delete&LT; _Ty&GT;&GT; &amp;)&#39;:尝试   引用删除的功能
  严重性代码说明项目文件行抑制状态错误   (active)function&#34; std :: unique_ptr&lt; _Ty,_Dx&gt; :: operator =(const   std :: unique_ptr&lt; _Ty,_Dx&gt; :: _ Myt&amp;)[with _Ty = lista,   _Dx =标准:: default_delete]&#34; (在&#34的第1436行声明; c:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ include \ memory&#34;)不能   引用 - 它是一个已删除的函数

1 个答案:

答案 0 :(得分:0)

您尝试在两个位置复制unique_ptr,但unique_ptr是仅移动类型,无法复制。您需要std::move代替它。

此外,在调用nullptr之后检查make_unique是没有意义的,因为如果分配失败,它将抛出std::bad_alloc并且永远不会达到检查。

因此,您的push函数应如下所示

void push(int x, unique_ptr<lista> &h) {
    auto alok_pam_x = make_unique<lista>(x);
    alok_pam_x->next = move(h);
    h = move(alok_pam_x);
}

最后,您应该考虑将push作为lista的成员函数。