【问题标题】:suspect result with std::map insertstd::map 插入的可疑结果
【发布时间】:2019-06-06 02:17:56
【问题描述】:

我尝试使用:

std::map<std::wstring, std::pair<std::wstring, INT_PTR>> mm;
**mm.insert(_T("name"), std::make_pair(_T("value1"), static_cast<INT_PTR>(1));**

这有什么问题?

如果我使用这个:

mm[_T("name")] = std::make_pair(_T("value1"), static_cast<INT_PTR>(1));

它有效。

错误是这样的:

No constructor could take the source type, or constructor overload resolution was ambiguous

同理:

std::map<std::wstring, std::vector<std::pair<std::wstring, INT_PTR>>> mm;

std::vector <std::pair<std::wstring, INT_PTR>> vec;
vec.push_back(std::make_pair(_T("value1"), static_cast<INT_PTR>(1)));
mm.insert(_T("name"), vec);

为什么它可以像这样与“insert_or_assign”一起使用?

mm.insert_or_assign(_T("name"), vec);

【问题讨论】:

  • 尝试emplace 而不是insert。直接转发给pair的构造函数。

标签: c++ stl stdmap


【解决方案1】:

std::map::insert 根本不采用您尝试的两个参数。它需要一个单参数键值对。

mm.insert(std::make_pair(_T("name"), std::make_pair(_T("value1"), static_cast<INT_PTR>(1))));

另一方面,std::map::insert_or_assign 确实采用了您正在尝试的两个参数。

【讨论】:

  • 这个来自 stl 的错误信息经常让我感到困惑,谢谢。
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多