C++ “没有函数模板的实例”;标准::制作“U对”;匹配参数列表

C++ “没有函数模板的实例”;标准::制作“U对”;匹配参数列表,c++,c++11,unordered-map,C++,C++11,Unordered Map,对像这样的成对类型使用无序的_映射合法吗?Visual Studio在第16行(map.insert(make_-pair(i+m,tt))中警告我“没有函数模板的实例”std::make_-pair与参数列表匹配): 无效测试(向量和nums) { 无序地图; 无序地图2; 矢量结果; 对于(int i=0;i

对像
这样的成对类型使用无序的_映射合法吗?Visual Studio在第16行(
map.insert(make_-pair(i+m,tt))
中警告我“没有函数模板的实例”std::make_-pair与参数列表匹配):

无效测试(向量和nums)
{
无序地图;
无序地图2;
矢量结果;
对于(int i=0;i

}

问题似乎是
std::make_pair()
:您应该让此模板推断出适当的类型:

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

根据C++标准20.3.3[配对.SPEC]段落9 <代码> STD::MaMaGueMUIONE()/<代码>声明如下:

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

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

只需删除
配对后的
部分即可

您可以传递类型并使其工作,但是规则是神秘的,并且过程是无用的;通过传递类型,您做得不对

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


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

为什么要将
std::vector>
作为引用才能正确匹配类型?@SebTu:模板参数是通过转发引用指定的(其类型将被推断)。当显式指定类型时,它将与
&&
组合。这是指,当对类型使用
X
时,您将有一个
X&&
类型的参数,只有右值可以绑定到该参数。使用
X&
X&&
引用折叠为非
const
左值后,该参数将变为
X&
可以绑定。参数
tt
是类型
std::vector
的非
const
左值。您也可以在
&
前面添加
const
,但在这种情况下不必这样做……最好不要使用这些类型!注意,也可以使用
std::move(tt)来更正代码
,无论如何,为了提高效率,应该这样做。
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)