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

このように明示的に提供すると、 moveセマンティクスと呼ばれる新しいC ++ 11機能が追加されたため、VS2012より前は正常に機能していました。あなたはそれをサポートする光沢のある新しいコンパイラを持っているので、後でその主題について読みたいと思うでしょう。

于 2012-12-16T15:18:24.273 に答える