我正在尝试为<MyKey, MyValue>
创建一个std :: map。 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
更难正确。
示例:使用第三方库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 });
给我上述错误。
此错误是什么意思,以及一般如何解决?
请帮助。
答案 0 :(得分:2)
如果要在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,可能不熟悉移动语义,因此对this question的回答可能会有所帮助。