2012-12-16 23 views
6

scavo di un vecchio progetto e voleva compilarlo, ma ha ricevuto diversi errori, alcuni di quelli che sono un C2664:C2664 in Visual Studio 2012 quando si utilizza 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 &&' 

Le parti di codice rilevanti sono:

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

Ho provato a rendere i parametri di funzione const, ma questo non ha aiutato.

Compilava bene in VS2010.

Per favore aiutami a scoprire cosa causa questo e come risolverlo.

risposta

16

make_pair() è stato modificato in VS2012 per supportare una nuova funzionalità C++ 11 chiamato spostare la semantica e ho il sospetto che specificare esplicitamente i tipi di make_pair() sta ottenendo nel modo.

Ricordare che make_pair() non richiede alcun parametro di modello da specificare esplicitamente. Li deduce dal tipo di ciascun argomento.

provare a rimuovere gli argomenti espliciti template da entrambe le chiamate a make_pair() in questo modo ...

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

in modo esplicito, fornendo loro come questo avrebbe funzionato bene pre-VS2012 a causa di una nuova funzionalità C++ 11 Inserita chiamato move semantics. Avrai voglia di leggere su quell'argomento più tardi visto che hai un nuovo compilatore brillante che lo supporta.