Le modèle C ++ n’accepte pas les iterators

Je réapprends le C ++ et j’ai commencé par essayer un algorithme qui devrait être simple: QuickSort Ma fonction a cette signature:

template  void QSort(typename std::vector::iterator begin, typename std::vector::iterator end) 

Et cela s’appelle dans ma fonction principale:

 int main() { std::vector unsort({56,32,11,45,67,81,12,5}); std::vector::iterator b=unsort.begin(); std::vector::iterator e=unsort.end(); QSort(b, e); return 0; } 

Et donne cette erreur:

 C:\Users\Deus\Projects\QSort\main.cpp||In function 'int main()':| C:\Users\Deus\Projects\QSort\main.cpp|49|error: no matching function for call to 'QSort(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator > >&, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator > >&)'| ||=== Build finished: 1 errors, 0 warnings ===| 

Il semble que le compilateur a du mal à résoudre ce que T devrait être. Existe-t-il un moyen de faire ce que j’essaie de faire ou devrais-je simplement déclarer les arguments comme étant du type T et gérer l’incertitude qui en résulte?

Le compilateur n’a aucun moyen de déduire T de votre appel de fonction. Pensez à ce qui se passe quand std::vector::iterator est T* :

 int *b = ...; int *e = ...; QSort(b, e); 

En général, si vous écrivez typename Something::anotherThing , le TemplateParemter ne peut pas être déduit dans l’appel. Il doit être explicitement fourni

 QSort(b, e); 

Je recommande d’utiliser simplement T comme type de paramètre. Cela vous permettra d’accepter non seulement les iterators de vecteurs, mais également T* , ou std::deque::iterator et tous les autres iterators à access aléatoire.