c++ - std::map insert 由于 "cannot convert argument 1 from ' 而无法编译 std::pair<MyKey, MyValue >' to ' std::pair<const _Kty,_Ty> & &'"

标签 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 });

给我上面的错误。

这个错误是什么意思,通常如何解决?

请帮忙。

最佳答案

如果您想将一个只能移动的对象插入到 std::map 中,那么您唯一的选择就是将其移动到 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 的答案可能会有帮助。

关于c++ - std::map insert 由于 "cannot convert argument 1 from ' 而无法编译 std::pair<MyKey, MyValue >' to ' std::pair<const _Kty,_Ty> & &'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58637020/

相关文章:

c++ - 是否可以使用 Boost.Hana 进行反序列化?

c++ - 子对象有一个指向其父对象的指针是不好的做法吗?

android - 如何为android gradle项目设置口味?神秘的重复类错误

python - 编译 io 编程语言时出错

c# - 从 C# 程序运行 C# 编译器

c++ - 为什么 QVariant 将 char 类型视为整数类型?

c++ - 具有伪继承设计 C++ 的模板

android - 基于一个代码库/项目创建演示版和完整版应用程序

email - Jenkins : Sending Build Trend Graph as email

python - 编译器找不到 Python.h