2012-12-16 15 views
6

wbijam się stary projekt i chciał go skompilować, ale otrzymała kilka błędów, kilka z tych, będąc c2664:c2664 w Visual Studio 2012 przy użyciu 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 &&' 

Odpowiednie fragmenty kodu są:

//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))); 
    //... 
} 

Próbowałem ustawić parametry funkcji const, ale to nie pomogło.

W VS2010 wszystko poszło dobrze.

Proszę, pomóżcie mi znaleźć przyczynę tego i jak go rozwiązać.

Odpowiedz

16

make_pair() została zmieniona w VS2012 wspierać nową funkcję C++ 11 nazywany ruch semantyka i podejrzewam, że jawnie określając typy dla make_pair() jest uzyskanie w drodze.

Pamiętaj, że make_pair() nie wymaga jawnie określonych parametrów szablonu. Wyciąga je z rodzaju każdego argumentu.

Spróbuj usunięcie wyraźnych argumentów szablonu z obu połączeń do make_pair() jak tak ...

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

Jawnie zapewnienie im jak byłoby to działało dobrze pre-VS2012 z powodu nowego C++ 11 Dodano funkcję o nazwie move semantics. Będziesz chciał przeczytać na ten temat później, ponieważ masz nowy, błyszczący kompilator, który go obsługuje.

Powiązane problemy