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

Posted

技术标签:

【中文标题】没有函数模板“std::make_pair”的实例与参数列表匹配【英文标题】:No instance of function template "std::make_pair" matches the argument list 【发布时间】:2016-12-25 23:18:18 【问题描述】:

将 unordered_map 用于 <int, vector<vector<int>>> 这样的对类型是否合法? Visual Studio 在第 16 行警告我“没有函数模板实例”std::make_pair 与参数列表匹配”(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);
            
        
    

【问题讨论】:

【参考方案1】:

问题似乎是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)

【讨论】:

为什么std::vector&lt;std::vector&lt;int&gt;&gt;&gt; 必须是正确匹配类型的引用? @SebTu:模板参数是通过转发引用指定的(其类型是用来推断的)。当明确指定类型时,它会与&amp;&amp; 结合使用。这一点,当使用 X 作为类型时,您将拥有一个类型为 X&amp;&amp; 的参数,只有右值可以绑定到该参数。使用X&amp; 给出X&amp; &amp;&amp; 在引用折叠后变为X&amp;const 左值可以绑定。参数ttstd::vector&lt;std::vector&lt;int&gt;&gt; 类型的非const 左值。您还可以在&amp; 前面添加const,但在这种情况下没有必要。 ...最好不要输入类型! 请注意,代码也可以通过使用std::move(tt) 进行更正,无论如何,为了提高效率,应该这样做。【参考方案2】:

你不应该将类型参数传递给make_pair;它应该推断它们,然后将它们转发到一对值。

只需删除make_pair 之后的&lt;int, vector&lt;vector&lt;int&gt;&gt;&gt; 部分。

您可以传递类型并使其工作,但规则很晦涩,过程无用;通过传递类型,你做错了。

如果要传递类型,请将make_pair 替换为pair 并直接构造。 make_pair 的重点是不必传递类型。

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

【讨论】:

以上是关于没有函数模板“std::make_pair”的实例与参数列表匹配的主要内容,如果未能解决你的问题,请参考以下文章

可变参数模板模板和完美转发

C++ 错误在模板类中声明 std::pair

扣除 string_view 的 std::make_pair 的一些奇怪行为

VS2012 error C2664: “std::make_pair”:无法将左值绑定到右值引用

使用make_pair时,Visual Studio 2012中的c2664

std :: make_pair:无法将'ch'(类型'char')转换为'char &&'[duplicate]