2017-01-04 23 views
0

Linuxコンパイルエラー - 文字列を含むマップに挿入するとき、タイプ 'string'をタイプ 'string &'に変換できません。同じことがWindows上でうまく構築されています。 私のユースケース:Linuxコンパイルエラー - タイプ 'string'をタイプ 'string &&'に変換できません

void insertIf(std::string str1, int value, std::map<std::string,int> &myMap) const 
{ 
    if(value == 1) 
    { 
     myMap.insert(std::make_pair<std::string, int>(str1, value));  
    } 
} 
+1

[mcve]がありますか? – user4581301

+1

Typo? 'arg1.insert(std :: make_pair (str1、int1));' < - '))' – Unimportant

答えて

1

std::make_pairがパラメータとして転送参照がかかるためです。テンプレートパラメータを明示的に指定する場合は、std::make_pairと推定コンテキストを使用し、std::pairのコンストラクタを使用する必要があります。ここで

のは、あなたの選択肢は次のとおりです。

make_pair:

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.insert(std::make_pair(str1, value)); 
    } 
} 

ペアコンストラクタさらに良い

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.insert(std::pair<std::string, int>(str1, value)); 
    } 
} 

emplace

あなたは本当に、明示的なパラメータで std::make_pairを使用したい場合は
void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.emplace(str1, value); 
    } 
} 

、テンプレートパラメータの値のカテゴリを指定することができますが、私はあなたがこのをしないように助言、それはちょっとstd::make_pairの全体の目的を敗北します:

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.insert(std::make_pair<std::string&, int&>(str1, value)); 
    } 
} 

編集:あなたはまだ転送の参照をサポートしていないVSの古いバージョンを使用する必要がありますので、それはWindows上で働いていました。

関連する問題