Visual Studio v120工具集编译时std::pair转换失败问题
报错触发原因
v120对应Visual Studio 2013工具集,v140对应Visual Studio 2015工具集,两者的STL实现存在差异,具体报错原因如下:
- 你的
m_mapCharged类型是std::map<std::string, SHOPPURCHASE>,insert方法要求传入的参数为std::pair<const std::string, SHOPPURCHASE>类型 - 代码中
sPURCHASE.strPurKey是MFC的CString类型,std::make_pair生成的临时对象是std::pair<CString, SHOPPURCHASE>,和insert要求的参数类型不匹配 - v140工具集的STL实现了泛化的pair转换构造函数,只要pair的两个元素分别支持隐式转换,就允许不同pair类型的隐式转换,因此可以正常编译;但v120工具集的STL没有实现该特性,不允许这种跨类型的pair隐式转换,因此触发类型匹配错误
完整报错提示如下:
IntelliSense: 没有重载函数“std::map<_Kty, _Ty, _Pr, _Alloc>::insert [with _Kty=std::string, _Ty=SHOPPURCHASE, _Pr=std::lessstd::string, _Alloc=std::allocator<std::pair<const std::string, SHOPPURCHASE>>]”的实例与参数列表匹配
参数类型为: (std::pair<ATL::CStringT<char, StrTraitMFC_DLL<char, ATL::ChTraitsCRT>>, SHOPPURCHASE>)
适配v120工具集的解决方案
以下三种修改方案都可以解决问题:
- 方案1:显式将CString转换为std::string,确保
make_pair生成的pair类型和map要求完全匹配
m_mapCharged.insert(std::make_pair(std::string(sPURCHASE.strPurKey.GetString()), sPURCHASE));
- 方案2:显式指定pair的目标类型,利用v120原生支持的CString到std::string的单元素隐式转换能力
m_mapCharged.insert(std::pair<std::string, SHOPPURCHASE>(sPURCHASE.strPurKey, sPURCHASE));
- 方案3:使用
emplace方法代替insert,直接在map内部构造元素,绕开旧版本STL的pair转换限制,代码更简洁
m_mapCharged.emplace(sPURCHASE.strPurKey, sPURCHASE);
内容的提问来源于stack exchange,提问作者Denta Rey Jordy
相关产品推荐
相关产品推荐

