报错代码
希望实现一个找到区间最大值的泛型函数,参数是左右迭代器,返回最大值。
#include<iostream>
#include<vector>
using namespace std;
template<class T>
T findmax(typename vector<T>::iterator left,typename vector<T>::iterator right){
T ret = *left;
for (;left!=right;++left){
ret = (*left)>ret ? *left : ret;
}
return ret;
}
int main(){
vector<int> a({3,4,6,2,1,5});
cout << findmax(a.begin(),a.end());
return 0;
}
报错
15:38: error: no matching function for call to ‘findmax(std::vector::iterator, std::vector::iterator)’
15 | cout << findmax(a.begin(),a.end());
5:3: note: candidate: ‘template T findmax(typename std::vector::iterator, typename std::vector::iterator)’
5 | T findmax(typename vector::iterator left,typename vector::iterator right){
5:3: note: template argument deduction/substitution failed:
15:38: note: couldn’t deduce template parameter ‘T’
15 | cout << findmax(a.begin(),a.end());
原因
编译器不能根据传入的类型vector< int >::iterator 猜到模板 T 是 int
解决方案
在函数调用的地方手动指定模板:
将用到的findmax改为findmax< int >:
#include<iostream>
#include<vector>
using namespace std;
template<class T>
T findmax(typename vector<T>::iterator left,typename vector<T>::iterator right){
T ret = *left;
for (;left!=right;++left){
ret = (*left)>ret ? *left : ret;
}
return ret;
}
int main(){
vector<int> a({3,4,6,2,1,5});
cout << findmax<int>(a.begin(),a.end());
return 0;
}
成功运行。