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)