9

我挖掘了一个旧项目并想编译它,但收到了几个错误,其中一些是 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 中编译得很好。

请帮助我找出导致此问题的原因以及如何解决它。

4

1 回答 1

19

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)));

像这样显式地提供它们在 VS2012 之前可以正常工作,因为添加了一个名为move semantics的新 C++11 特性。稍后您将需要阅读该主题,因为您有一个支持它的闪亮的新编译器。

于 2012-12-16T15:18:24.273 回答