I’m trying to overload a Sum function which accepts a [list or vector] start and end iterator as arguments. This compiler error is really confusing me. Relevant code is as follows:
template <typename T1, typename T2>
const double Sum(const typename T1::const_iterator& start_iter, const typename T2::const_iterator& end_iter)
{// overloaded function that calculates sum between two iterators
typename T1::const_iterator iterator_begin = start_iter;
typename T2::const_iterator iterator_end = end_iter;
double my_sum = 0;
for (iterator_begin; iterator_begin != iterator_end; iterator_begin++)
my_sum += *iterator_begin;
return my_sum;
}
int main()
{
list<double> test_list(10,5.1);
cout << Sum(test_list.begin(), test_list.end()); // compiler errors here
}
I get the following compiler errors:
iterators.cpp(72): error C2783: ‘const double Sum(const
T1::const_iterator &,const T2::const_iterator &)’ : could not deduce
template argument for ‘T1’iterators.cpp(72): error C2783: ‘const double Sum(const
T1::const_iterator &,const T2::const_iterator &)’ : could not deduce
template argument for ‘T2’iterators.cpp(72): error C2780: ‘const double Sum(const
std::map &)’ : expects 1 arguments – 2 providediterators.cpp(72): error C2780: ‘const double Sum(const T &)’ :
expects 1 arguments – 2 provided
How is the compiler not recognizing I’m trying to call the Sum function with two inputs? I’m calling the function incorrectly?
Thanks!
You dont need to tell it that iterators have to be members of some types
T1andT2, just template it on iterator type itself:also there is a standard std::accumulate that does this: