Вставка std :: map не компилируется из-за того, что "не удалось преобразовать аргумент 1 из 'std :: pair'to' std :: pair&& '» - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь создать карту std :: map для <MyKey, MyValue>. MyKey - это перечисление, MyValue - внешний класс.

Вызов myMap.insert({ key, value }) всегда приводит к ошибке компиляции с ошибкой

"cannot convert argument 1 from 'std::pair<MyKey, MyValue>' to 'std::pair<const _Kty,_Ty> &&'"

Хотя примитивные типы данных всегда работают с std::map.insert(),эта проблема возникает так часто при попытке содержать классы, написанные кем-то другим. С различными сторонними классами я пробовал много обходных путей, таких как создание объектов заранее или установка их атрибутов после вставки. Но я еще не нашел систематического способа исправить это. Кажется, std::map гораздо сложнее понять, чем, скажем, Python dict.

Пример: с третьей стороной lib cppzmq, Visual Studio 2017

enum MyKey {
    key1,
    key2
}

std::map<MyKey, zmq::socket_t> mymap;

std::shared_ptr<zmq::context_t> g_context = std::make_shared<zmq::context_t>(1);

zmq:socket_t sock(*g_context, zmq::socket_type::pair);

mymap.insert({ key1, sock });

дает мневышеуказанная ошибка.

Что означает эта ошибка и как ее исправить в целом?

Пожалуйста, помогите.

1 Ответ

2 голосов
/ 31 октября 2019

Если вы хотите вставить объект только для перемещения в std::map, тогда единственный вариант - переместить его на карту. Адаптируя свой пример, вы можете попробовать это:

mymap.insert({key1, zmq:socket_t{*g_context, zmq::socket_type::pair}});

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

zmq:socket_t sock{*g_context, zmq::socket_type::pair};
mymap.insert({key1, std::move(sock)});
// note that sock is in a "moved from" state after this point

Я вижу, что вы пришли из Python и, возможно, не знакомы с семантикой перемещенияпоэтому ответы на этот вопрос могут быть полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...