函数模板“std :: make_pair”的实例与参数列表不匹配

时间:2016-12-25 23:18:18

标签: c++ c++11 unordered-map

<int, vector<vector<int>>>这样的配对类型使用unordered_map是否合法? Visual Studio警告我“没有函数模板的实例”std :: make_pair匹配参数列表“第16行(map.insert(make_pair<int, vector<vector<int>>>(i + m, tt))):

void test(vector<int>& nums) 
{
    unordered_map<int, vector<vector<int>>> map;
    unordered_map<int, unordered_set<int>> map2;
    vector<vector<int>> results;

    for (int i = 0; i < nums.size(); i++)
    {
        for (int m = i + 1; m < nums.size(); m++)
        {
            if (!map.count(i + m))
            {
                vector<int> t{ i, m };
                vector<vector<int>> tt;
                tt.push_back(t);
                map.insert(make_pair<int, vector<vector<int>>>(i + m, tt));
                map2.insert(make_pair<int, unordered_set<int>>(i + m, unordered_set<int>(i - m)));
            }
            else if (map2.at(i + m).count(i - m) || map2.at(i + m).count(m - i))
            {
                continue;
            }
            else
            {
                map.at(i + m).push_back(vector<int>{i, m});
                map2.at(i + m).insert(i - m);
            }
        }
    }

}

2 个答案:

答案 0 :(得分:5)

问题似乎是std::make_pair():你应该让这个模板推断出合适的类型:

map.insert(std::make_pair(i + m, tt));

根据C ++标准20.3.3 [pair.spec]第9段std::make_pair()声明如下:

template <typename F, typename S>
std::pair<???, ???> make_pair(F&& first, S&& second)

(为???填写了合适的类型)。但是,您指定的类型确实与参数不匹配!如果要正确指定类型,可以使用

std::make_pair<int, std::vector<std::vector<int>>&>(i + m, tt)

答案 1 :(得分:2)

你不应该将类型参数传递给make_pair;它应该推导出来,然后将它们转发给一对价值观。

只需删除<int, vector<vector<int>>>之后的make_pair部分。

你可以传递类型并使它工作,但规则是神秘的,程序没用;通过传递类型,你做错了。

如果要传递类型,请将make_pair替换为pair并直接构建。 make_pair的要点必须传递类型。

如果您想了解有关此特定错误以及make pair如何工作的更多信息,请阅读有关模板函数类型推导和转发参考的信息。