Linux 编译错误 - 无法将类型"字符串"转换为类型"字符串&&"

Linux compilation error - cannot convert type ‘string’ to type ‘string&&’

本文关键字:类型 字符串 转换 错误 编译 Linux      更新时间:2023-10-16

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

这是因为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,该版本还不支持转发引用。