2012-12-16 5 views
6

ich ein altes Projekt raben und es kompilieren wollte, erhielt aber einige Fehler, ein paar von denen sind ein C2664:C2664 in Visual Studio 2012, wenn make_pair mit

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 &&' 

Die entsprechenden Codeteile sind:

Ich habe versucht, die Funktionsparameter const zu machen, aber das hat nicht geholfen.

Kompatibel in VS2010.

Bitte helfen Sie mir zu finden, was dies verursacht und wie es zu lösen.

Antwort

16

make_pair() wurde in VS2012 geändert, um ein neues C++ 11 Features namens bewegt Semantik und ich vermute, zu unterstützen, dass die Typen für make_pair() wird immer in der Art und Weise explizit angeben.

Denken Sie daran, dass make_pair() keine Template-Parameter benötigt, die explizit angegeben werden. Sie leitet sie vom Typ jedes Arguments ab.

Versuchen Sie, die expliziten Template-Argumente von beiden Anrufen zu make_pair() wie so zu entfernen ...

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

Explizit sie so bereitstellt hätte funktioniert gut vorge VS2012 wegen eines neues C++ 11 Features namens hinzugefügt move semantics. Sie sollten sich später mit diesem Thema befassen, da Sie einen glänzenden neuen Compiler haben, der dies unterstützt.