我正在使用模板函数,以便它可以使用不同数值数据类型的列表或向量。但其中一个有问题:
// This function should take 2 iterators of a vector/list and sum the elements between them
template <typename T >
double Sum1(typename T::const_iterator start, typename T::const_iterator end){
double sum = 0;
// For g++, "typename is needed before T::const_iterator"
for(typename T::const_iterator I = start; I <= end;I++){
sum += *I;
}
return sum;
}
在main()中,它被称为:
vector<double> b;// and it is pushed by numbers 1-9 later
cout<<Sum1(b.begin(), b.end())<<endl;
但是编译器给了我错误
没有用于调用'Sum1(std :: vector :: iterator,&gt; std :: vector :: iterator)'的匹配函数
无法推断模板参数'T'
但是,此功能正常工作:
// T can be vector<int>, list<double>, etc.
template <typename T >
double Sum(T& values){
double sum = 0;
// For g++, "typename is needed before T::const_iterator"
for(typename T::const_iterator I = values.begin(); I != values.end();I++){
sum += *I;
}
return sum;
}
知道为什么会这样吗?我应该如何修改第一个函数,以便它可以采用向量/列表的2个迭代器并计算它们之间的总和?
答案 0 :(得分:4)
而不是对容器类型进行模板化,而是在迭代器上进行模板化。并且不要将用户限制为const_iterator
- 任何迭代器应该做的是你实际上没有通过迭代器修改内容:
template <typename Iter> double Sum1(Iter start, Iter end)
通过执行此操作,您还可以使用任何可解除引用且可递增的类型 - 例如简单指针。