由于“无法将参数1从'std :: pair <MyKey,MyValue>'转换为'std :: pair <const _Kty,_Ty> &&',std :: map插入无法编译”

时间:2019-10-31 04:42:04

标签: c++ build compilation initializer

我正在尝试为<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 });

给我上述错误。

此错误是什么意思,以及一般如何解决?

请帮助。

1 个答案:

答案 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的回答可能会有所帮助。