在unordered_map中插入字符串键,值时出错

时间:2015-10-22 05:50:48

标签: c++

我正在用C ++编写我的第一个STL程序,我正面临这个问题。

这是我的计划:

#include <iostream>
#include <unordered_map>

using namespace std;

int main()
{
    int n,m;
    // n : number of file extenstions
    // m : number of filenames to identify
    string extension, type, filename;
    cin >> n >> m;

    unordered_map<string,string> hashmap;

    while(n--)
    {
        cin >> extension >> type;
        hashmap.insert(make_pair<string,string>(extension,type));
    }
    while(m--)
    {
        cin >> filename;
        extension = filename.substr(filename.find_last_of('.')+1);
        cout << extension << endl;
    }
}

我的输入文件是:

5 6
html text/html
htm text/html
png image/png
svg image/svg+xml
txt text/plain
index.html
this.file.has.lots.of.dots.txt
nodotsatall
virus.exe
dont.let.the.png.fool.you
case.matters.TXT

我收到错误:no matching function for call to ‘make_pair(std::string&, std::string&)’。我无法弄清楚问题。

2 个答案:

答案 0 :(得分:2)

错误在行

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_0.exe
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_0.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_1.exe
zxcqw84c81d96792ec917b7asd541f68d70324c4eb20018b598c1d5e84182bd_2.exe

应该是

make_pair<string,string>(extension,type)

答案 1 :(得分:0)

首先,我宁愿使用make_pair(extension, type)并让编译器在任何情况下推断出类型,以避免任何其他人建议的风险。

无论如何,我认为下面的详细信息从您的角度来看很有意思,因此将它们置于专门的回复中是值得的,希望它们也是正确的。

也就是说,请参阅documentation

据我所知(我不是专家),你的案例中推断的类型将是T&amp; U&amp;,因此使用这对夫妇T, U(作为<string, string> )以函数原型结束,该函数原型不接受引用作为参数(这就是为什么你得到错误,特别是那个错误)。

您可以在您的情况下使用以下模式:

make_pair<string&,string&>(extension,type)

这个适用于您实际使用引用来初始化该对,并且您将需要与模板参数相同的内容。

同样,因为make_pair可以很容易地推断出它的论证类型,你可以自由地省略它们,我强烈建议这样做。