std::map insert由于"cannot convert argument 1 from 'std::pair<MyKey, MyValue>' to 'std::pair&



我正在尝试为<MyKey, MyValue>创建一个std::映射。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 });

给了我上述错误。

这个错误意味着什么?通常如何修复它?

如果您想将仅移动对象插入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,可能不熟悉移动语义,所以这个问题的答案可能会有所帮助。

最新更新