Как использовать C ++ unordered_map unique_ptr списка - PullRequest
1 голос
/ 18 января 2020
#include <memory>
#include <list>
#include <unordered_map>
class ClsA {
};

typedef std::list<ClsA*> ClsAList;
typedef std::unordered_map< int, std::unique_ptr < ClsAList> > ClsAListMap;

ClsAListMap map;
void Insert(int id, ClsA *a) {          
    auto list = new ClsAList{ a };
    std::unique_ptr<ClsAList> smart_list(list);

    //compilation error here
    map.insert(id, smart_list);//error
    map.insert({ a, smart_list});//error
}

Из-за многоуровневого шаблона подсказка об ошибке вообще не читается, что здесь не так?

Кстати, как использовать make_unique в этой ситуации? Я пробовал это безуспешно, только длинные ошибки подсказывают кошмары.

1 Ответ

1 голос
/ 18 января 2020

Есть две вещи, которые нужно исправить. Во-первых, вы хотите emplace новый элемент (вы можете использовать insert, но он будет более сложным). Во-вторых, поскольку вы не можете скопировать unique_ptr, вам нужно переместить его вместо:

map.emplace(id, std::move(smart_list));

Чтобы использовать make_unique, вам нужно инициализировать список немного по-другому:

auto list = std::make_unique<ClsAList>(1, a);

При этом используется конструктор, который берет начальное количество элементов для помещения в список и значение для их установки.

Наконец, они могут быть объединены в один оператор:

map.emplace(id, std::make_unique<ClsAList>(1, a));

Поскольку начальный unique_ptr является временным, он будет перемещен из (автоматически, поскольку это возможно в этом случае).

...