Linux编译错误 - 无法将类型'string'转换为'string&&'

时间:2017-01-04 17:17:45

标签: c++

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

1 个答案:

答案 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,它不支持转发引用。