Добавление уникального указателя объектов на карту - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь добавить уникальный указатель на карту.

auto monkey= std::unique_ptr<Animal> (new Animal(1,"Tom"));

std::map<int, std::unique_ptr<const Animal>> animals;    //Map of animals

animals.insert(pair<int, unique_ptr<Animal>>(1,monkey));    // Error here


Error:error: no matching function for call to 'std::pair<int, std::unique_ptr<Animal> >::pair(int&, std::unique_ptr<Animal>&)'

что бы добавить? ?? 1004 *

Ответы [ 2 ]

4 голосов
/ 10 января 2020

std::unique_ptr не копируется, но может быть перемещен, вам нужно std::move это.

Вы можете сделать:

animals.emplace(1, std::move(monkey));
1 голос
/ 10 января 2020

Я бы предложил вам использовать следующее при попытке вставить std::unique_ptr в std::map:

animals.insert(std::make_pair(1, std::unique_ptr<Animal>(new Animal(1,"Tom"))));

или

animals.insert(std::make_pair(1, std::make_unique<Animal>(1,"Tom")));

Во-первых, предпочтительнее использовать std::make_pair над std::pair конструктор, потому что с std::pair вам нужно указать типы обоих элементов, тогда как std::make_pair будет выводить типы элементов, которые ему передаются.

Во-вторых, как говорит другой ответ, std::unique_ptr не может быть скопировано, потому что оно уникально. Его можно переместить только на std::move. В этом случае, поскольку вы передаете ссылку на r-значение в функцию std::make_pair, она перемещается.

...