Ошибка C2280 вектор объектов, которые имеют члены unique_ptr - PullRequest
1 голос
/ 18 февраля 2020

Мне кажется, я знаю , почему это происходит, но, будучи новичком в c ++, я не уверен, каков правильный способ справиться с этим (без использования необработанных указателей). Из моих исследований выясняется, что при попытке push_back Stage объекта в векторе предпринимается попытка копирования, и, поскольку Stage содержит unique_ptr членов, которые удалили конструкторы копирования, возникает следующая ошибка.

Правильно ли мое понимание? Если да, то как лучше всего решить эту проблему в современном c ++?

Пример минимальной воспроизводимости

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

class Actor
{
private:
    int prop1 = 1;
    int prop2 = 2;
public:
    Actor() {}
};

class Stage
{
public:
    Stage() {}
    std::vector<std::unique_ptr<Actor>> actors;
};

class App
{
public:
    App() {}
    std::vector<Stage> stages;
};

int main()
{
    auto act1 = std::make_unique<Actor>();

    auto sta1 = Stage();
    sta1.actors.push_back(std::move(act1));

    auto app = App();
    app.stages.push_back(sta1); // Issue occurs when copying Stage object into vector since Stage object contains members of type unique_ptr (or at least that's my best guess from the research I have done)

    std::cin.get();
    return 0;
}

Ошибка компилятора из MSV C

Error   C2280   'std::unique_ptr<Actor,std::default_delete<_Ty>>::unique_ptr(
const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to 
reference a deleted function    SmartPointers   
c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.12.25827\include\xmemory0    945 

1 Ответ

3 голосов
/ 18 февраля 2020

unique_ptr не может быть скопировано, только перемещено. Вот почему он называется уникальным.

Вы использовали правильный подход при нажатии на actors, поэтому вам нужно только адаптировать его к stages.

 app.stages.push_back(std::move(sta1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...