没有函数模板“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<std::vector<int>>>
必须是正确匹配类型的引用?
@SebTu:模板参数是通过转发引用指定的(其类型是用来推断的)。当明确指定类型时,它会与&&
结合使用。这一点,当使用 X
作为类型时,您将拥有一个类型为 X&&
的参数,只有右值可以绑定到该参数。使用X&
给出X& &&
在引用折叠后变为X&
非const
左值可以绑定。参数tt
是std::vector<std::vector<int>>
类型的非const
左值。您还可以在&
前面添加const
,但在这种情况下没有必要。 ...最好不要输入类型!
请注意,代码也可以通过使用std::move(tt)
进行更正,无论如何,为了提高效率,应该这样做。【参考方案2】:
你不应该将类型参数传递给make_pair
;它应该推断它们,然后将它们转发到一对值。
只需删除make_pair
之后的<int, vector<vector<int>>>
部分。
您可以传递类型并使其工作,但规则很晦涩,过程无用;通过传递类型,你做错了。
如果要传递类型,请将make_pair
替换为pair
并直接构造。 make_pair
的重点是不必传递类型。
如果您想了解有关此特定错误以及 make pair 工作原理的更多信息,请阅读有关模板函数类型推导和转发引用的信息。
【讨论】:
以上是关于没有函数模板“std::make_pair”的实例与参数列表匹配的主要内容,如果未能解决你的问题,请参考以下文章
扣除 string_view 的 std::make_pair 的一些奇怪行为
VS2012 error C2664: “std::make_pair”:无法将左值绑定到右值引用