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
est T*
:
int *b = ...; int *e = ...; QSort(b, e);
En général, si vous écrivez typename Something
, 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
et tous les autres iterators à access aléatoire.