Я не могу push_back unique_ptr после того, как передал его в функцию - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над своим небольшим проектом об указателях, я столкнулся с проблемой, когда пытался передать sh unique_ptr в производный класс, в вектор unique_ptr в базовый класс. Он продолжает говорить, что я «пытаюсь сослаться на удаленную функцию». Я пытался использовать push_back с и без std :: move, но ничего не получалось ...

#include<iostream>
#include<memory>
#include<vector>

using namespace std;

class Base {};
class Derived : public Base {};

void add(vector<unique_ptr<Base>> list, const unique_ptr<Base>& ptr);

int main()
{
    vector<unique_ptr<Base>> list;
    unique_ptr<Base> derived(new Derived);
    add(list, derived);
}

void add(vector<unique_ptr<Base>> list, const unique_ptr<Base>& ptr)
{
    list.push_back(move(ptr));
}

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

С вашим кодом довольно много проблем:

Вот исправленный код:

void add(std::vector<std::unique_ptr<Base>>& list, std::unique_ptr<Base> ptr)
{
    list.push_back(std::move(ptr));
}
int main()
{
    std::vector<std::unique_ptr<Base>> list;
    std::unique_ptr<Base> derived = std::make_unique<Derived>();

    add(list, std::move(derived));
}

// or

int main()
{
    std::vector<std::unique_ptr<Base>> list;

    add(list, std::make_unique<Derived>());
}
0 голосов
/ 03 мая 2020

Вы не можете использовать std::move() с постоянной переменной, и вы должны взять вектор по ref. если вы хотите добавить элемент к нему и увидеть это Почему "используется пространство имен std;" считается плохой практикой?

#include<iostream>
#include<memory>
#include<vector>


class Base {};
class Derived : public Base {};

void add(std::vector<unique_ptr<Base>>&, std::unique_ptr<Base>&);

int main()
{
    std::vector<unique_ptr<Base>> list;
    std::unique_ptr<Base> derived(new Derived);
    add(list, derived);
}

void add(std::vector<unique_ptr<Base>>& list, std::unique_ptr<Base>& ptr)
{
    list.push_back(std::move(ptr));
}
...