Linux编译错误 - 在插入包含字符串的地图时,无法将类型'string'转换为'string&&'类型。同样在Windows上正常运行。 我的用例:
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));
}
}
答案 0 :(得分: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
:
void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) {
if(value == 1 {
myMap.emplace(str1, value);
}
}
如果你真的想将std::make_pair
与显式参数一起使用,你可以在模板参数中指定值类别,但我建议你不要这样做,它有点挫败了整个目的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));
}
}
编辑它在Windows上运行,因为您必须使用过时版本的VS,它不支持转发引用。