使用make_pair时,Visual Studio 2012中的c2664

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用make_pair时,Visual Studio 2012中的c2664相关的知识,希望对你有一定的参考价值。

我挖了一个旧项目并想编译它,但收到了几个错误,其中一些是c2664:

error C2664: 'std::make_pair' : cannot convert parameter 1 from 'CUser *' to 'CUser *&&'
error C2664: 'std::make_pair' : cannot convert parameter 1 from 'unsigned long' to ' unsigned long &&'

相关的代码部分是:

//typedef for the userdata map
typedef std::map<unsigned long, std::pair<CUser*,userstatus*>> UserDataMapType;
//...
Inc::incret CUserManager::AddUser(unsigned long ID, CUser* pUser, userstatus* pUserStatus)
{
    //...
    std::pair<UserDataMapType::iterator, bool> ret = m_mapUserData.insert(std::make_pair<unsigned long, std::pair<CUser*, userstatus*>>(ID, std::make_pair<CUser*, userstatus*>(pUser, pUserStatus)));
    //...
}

我试图使函数参数const,但这没有帮助。

它确实在VS2010中编译得很好。

请帮我找到导致此问题的原因以及解决方法。

答案

make_pair()在VS2012中已被更改,以支持称为移动语义的新C ++ 11特性,我怀疑明确指定make_pair()的类型正在阻碍。

请记住,make_pair()不需要显式指定任何模板参数。它从每个参数的类型推导出它们。

尝试从两次调用make_pair()中删除显式模板参数,如此...

std::pair<UserDataMapType::iterator, bool> ret = m_mapUserData.insert(std::make_pair(ID, std::make_pair(pUser, pUserStatus)));

由于添加了一个名为move semantics的新C ++ 11功能,因此在VS2012之前明确地提供这些功能会很好。稍后您会想要阅读该主题,因为您有一个支持它的闪亮的新编译器。

以上是关于使用make_pair时,Visual Studio 2012中的c2664的主要内容,如果未能解决你的问题,请参考以下文章

visual-studio-code 中的自动右括号不适用于 js 和 jsx 文件

visual studio 2010问题修复

+= 操作符对和 make_pair 与模板

VS2010上 C++ multimap容器 运行时出错

make_pair

在 C++ 中使用 make_pair 对两个向量进行排序函数