c++模板函数的类型推导

我在用泛型编程写二维vector的排序模板时,写出这样一个代码:

//vector的字典序比较,v1<v2是true,v1>=v2是false
template<typename T>
bool cmp(vector<T>&v1,vector<T>&v2)
{
    for(int i=0;i<v1.size()&&i<v2.size();i++)
    {
        if(v1[i]!=v2[i])return v1[i]<v2[i];
    }
    return v1.size()<v2.size();
}
//vector的字典序排序
template<typename T>
void sortVector(vector<vector<T>>&v)
{
    sort(v.begin(),v.end(),cmp);
}

编译结果:

1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(3802) : 参见“std::sort”的声明
1>c:\users\z00454773\documents\visual studio 2010\projects\20191228.cpp\20191228.cpp\csimsgeek.cpp(273): error C2780: “void std::sort(_RanIt,_RanIt)”: 应输入 2 个参数,却提供了 3 个

这就很奇怪了,一般在sort里面用自定义排序函数,就是加函数指针啊!

很快,我就想到了,这里的cmp是模板函数,它是需要根据类型参数来实例化的。

也就是说,模板函数直接调用是可以自动推导类型的,但是如果要用做函数指针的话,需要传入类型参数才能实例化

正确代码:

//vector的字典序排序
template<typename T>
void sortVector(vector<vector<T>>&v)
{
    sort(v.begin(),v.end(),cmp<T>);
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/107536708
今日推荐