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

举报
用户已注销 发表于 2021/11/19 04:13:47 2021/11/19
【摘要】 我在用泛型编程写二维vector的排序模板时,写出这样一个代码: //vector的字典序比较,v1<v2是true,v1>=v2是falsetemplate<typename T>bool cmp(vector<T>&v1,vector<T>&v2){ for(i...

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


  
  1. //vector的字典序比较,v1<v2是true,v1>=v2是false
  2. template<typename T>
  3. bool cmp(vector<T>&v1,vector<T>&v2)
  4. {
  5. for(int i=0;i<v1.size()&&i<v2.size();i++)
  6. {
  7. if(v1[i]!=v2[i])return v1[i]<v2[i];
  8. }
  9. return v1.size()<v2.size();
  10. }
  11. //vector的字典序排序
  12. template<typename T>
  13. void sortVector(vector<vector<T>>&v)
  14. {
  15. sort(v.begin(),v.end(),cmp);
  16. }

编译结果:

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是模板函数,它是需要根据类型参数来实例化的。

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

正确代码:


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

 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/107536708

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。