【问题标题】:std::map insert doesn't compile due to "cannot convert argument 1 from 'std::pair<MyKey, MyValue>' to 'std::pair<const _Kty,_Ty> &&'"std::map 插入无法编译,因为“无法将参数 1 从 'std::pair<MyKey, MyValue>' 转换为 'std::pair<const _Kty,_Ty> &&'”
【发布时间】:2020-02-26 10:33:30
【问题描述】:

我正在尝试为&lt;MyKey, MyValue&gt; 创建一个 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 });

给我上面的错误。

这个错误是什么意思,一般如何解决?

请帮忙。

【问题讨论】:

标签: c++ build compilation initializer


【解决方案1】:

如果您想将只能移动的对象插入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 的答案可能会有所帮助。

【讨论】:

  • 非常感谢!我确实对 C++11 很陌生。
  • 顺便说一句,当前的编译器错误消息与 C++11 之前的天数一样神秘,是否有解决这些错误的知识库?
  • @kakyo 我猜有旧的 stackoverflow 问题。如果您想要更好的错误消息,请使用全新的 C++17 编译器。
  • @kakyo 虽然这样并没有太大帮助。理解神秘的错误信息需要经验。 C++ 是一门复杂的语言,所以错误信息总是很复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多