I would like to overload the “+” operator of iterator in list class, something like
list<double>::iterator operator+(const list<double>::iterator& it, int n)
This works well. However, when I try to implement it as template, like
template<class T>
typename list<T>::iterator operator+(const typename list<T>::iterator& it, int n)
I got error msg like,
no match for 'operator+' in 'it + small_index'
can’t figure out the reason…
The code is attached below,
#include<iostream>
#include<list>
using namespace std;
template<class T>
ostream& operator<< (ostream& os, const list<T>& l)
{
typename list<T>::const_iterator i = l.begin();
for (;i!=--l.end();i++)
os<<*i<<";";
os<<*i<<endl;
return os;
}
template<class T> //this is where it goes WRONG.
//If don't use template, delete "typename", T->double, runs well
typename list<T>::iterator operator+(const typename list<T>::iterator& it, int n)
{
typename list<double>::iterator temp=it;
for(int i=0; i<n; i++)
temp++;
return temp;
}
template <class T>
void small_sort(list<T>& l)
{
int n = l.size();
typename list<T>::iterator it = l.begin();
for(int i=0; i<n-1; i++)
{
//Find index of next smallest value
int small_index = i;
for(int j=i+1; j<n; j++)
{
if(*(it+j)<*(it+small_index)) small_index=j;
}
//Swap next smallest into place
double temp = *(it+i);
*(it+i) = *(it+small_index);
*(it+small_index)=temp;
}
}
int main()
{
list<double> l;
l.push_back(6);
l.push_back(1);
l.push_back(3);
l.push_back(2);
l.push_back(4);
l.push_back(5);
l.push_back(0);
cout<<"=============sort the list=============="<<endl;
small_sort(l);
cout<<l;
return 0;
}
The problem is that the argument is not deducible in that context.
When you use an iterator there, the compiler would have to generate all possible instantiations of
listwith any given type, and try to match an internal typeiteratorwith the argument that you are passing, note that the set of all types is actually infinite once you add templates to the mix, as you can instantiate a template with an instantiation of the same template ad infinitum.I recommend that you avoid the problem altogether and use
std::advancewhich is the idiomatic way of advancing an iterator.