WedX - журнал о программировании и компьютерных науках

Невозможно push_back an unique_ptr в векторе

У меня ошибка с этим кодом:

void Game::changeState(gameState type) // gameState is an enum
{
   if (!states.empty()) // deleting the last state
   {
       states.back()->clean();
       states.pop_back();
   }

   switch(type)
   {
       case editorState:
       {
           states.push_back(std::move(std::unique_ptr<EditorState> (new EditorState)));
           states.back()->init();
           break;
       }
       case menuState:
       {
           states.push_back(std::move(std::unique_ptr<MenuState> (new MenuState)));
           states.back()->init();
           break;
       }

   }
}

Вектор:

std::vector<std::unique_ptr<GameState>> states;

Сообщение об ошибке:

c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ unique_ptr.h || В экземпляре 'void std :: default_delete ‹_Tp> :: operator () (_ Tp *) const [with _Tp = GameState] ': | c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7 .1 \ include \ c ++ \ bits \ unique_ptr.h | 245 | требуется из 'void std :: unique_ptr ‹_Tp, _Dp> :: reset (std :: unique_ptr‹ _Tp, _Dp> :: pointer) [с _Tp = GameState; _Dp = std :: default_delete; std :: unique_ptr ‹_Tp, _Dp> :: pointer = GameState *] '| c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ unique_ptr.h | 169 | требуется из 'std :: unique_ptr ‹_Tp, _Dp> :: ~ unique_ptr () [с _Tp = GameState; _Dp = std :: default_delete] '| c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ stl_construct.h | 95 | требуется из 'void std :: _ Destroy (_Tp *) [with _Tp = std :: unique_ptr]' | c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ stl_construct.h | 105 | требуется из 'static void std :: _ Destroy_aux ‹> :: __ destroy (_ForwardIterator, _ForwardIterator) [с _ForwardIterator = std :: unique_ptr *; bool = false] '| c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ stl_construct.h | 128 | < strong> требуется из 'void std :: _ Destroy (_ForwardIterator, _ForwardIterator) [с _ForwardIterator = std :: unique_ptr *]' | c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ stl_construct.h | 155 | требуется из 'void std :: _ Destroy (_ForwardIterator, _ForwardIterator, std :: allocator ‹_T2> &) [с _ForwardIterator = std :: unique_ptr *; _Tp = std :: unique_ptr] '| c: \ program files (x86) \ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ stl_vector.h | 403 | требуется из 'std :: vector ‹_Tp, _Alloc> :: ~ vector () [с _Tp = std :: unique_ptr; _Alloc = std :: allocator>] '| ... \ game.h | 15 | требуется отсюда | c: \ program files (x86) \ codeblocks \ mingw \ bin. . \ lib \ gcc \ mingw32 \ 4.7.1 \ include \ c ++ \ bits \ unique_ptr.h | 63 | ошибка: недопустимое применение sizeof к неполному типу GameState | || == = Сборка завершена: 1 ошибка, 12 предупреждений (0 минут, 1 секунда) === |

Мой код выше работает, когда я использую указатели по умолчанию, но когда я использую unique_ptr, он дает мне указанную выше ошибку ...

РЕДАКТИРОВАТЬ: Вот game.h: https://pastebin.com/DiBbXrC6 И состояние игры: https://pastebin.com/JD3VrktJ


  • Во-первых, unique_ptr будет перемещен по умолчанию, поэтому std::move не требуется. Во-вторых, попробуйте вместо этого states.emplace_back(new EditorState);. 25.01.2014
  • Важной частью этого является ошибка: недопустимое применение sizeof к неполному типу GameState, поэтому, пожалуйста, покажите нам контекст. Похоже, что определение этой функции Game::changeState не видит dtor GameState. 25.01.2014
  • @Joachim emplace_back тоже не работает. 25.01.2014
  • @dyp я пришлю код через несколько минут ... 25.01.2014
  • Самая интересная часть находится внутри game.h - приведенный выше код не имеет отношения к ошибке. 25.01.2014
  • @JoachimPileborg: это безопасно? 25.01.2014
  • я отредактировал свое сообщение, теперь у тебя есть код 25.01.2014
  • Тогда мой ответ правильный - я могу его расширить, если вам нужны дополнительные пояснения. 25.01.2014

Ответы:


1

При использовании unique_ptr вам необходимо явно определить класс T везде, где вы объявляете unique_ptr<T>. Т.е. включить заголовок для class GameState, не пересылать объявление в заголовок game.h.

Это избавит от error: invalid application of 'sizeof' to incomplete type 'GameState'.

Более подробный ответ можно найти здесь.

25.01.2014
  • Что ж, я думаю, что это проблема, спасибо, я попробую что-нибудь еще для изменения моих состояний 25.01.2014
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]