2012-12-16 4 views
6

Я выкопать старый проект и хотел собрать его, но получил несколько ошибок, некоторые из тех, будучи C2664:C2664 в Visual Studio 2012 при использовании make_pair

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.

Пожалуйста, помогите мне найти причину этого и как его решить.

ответ

16

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 из-за новой особенностью C++ 11 добавлена ​​называется move semantics. Вы захотите прочитать эту тему позже, так как у вас есть блестящий новый компилятор, который ее поддерживает.

 Смежные вопросы

  • Нет связанных вопросов^_^