Szablon C ++ nie akceptuje iteratorów

Ponownie uczę się C ++ i zacząłem od wypróbowania prostego algorytmu: QuickSort. Moja funkcja ma ten podpis:

template <class T>
void QSort(typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end)

I nazywa się to w mojej głównej funkcji:

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

I podaje ten błąd:

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<int> > >&, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&)'|
||=== Build finished: 1 errors, 0 warnings ===|

Wydaje się, że kompilator ma problemy z rozwiązaniem tego, czym powinien być T. Czy istnieje sposób na zrobienie tego, co próbuję zrobić, czy powinienem zadeklarować argumenty jako typ T i pracować z wynikającą z tego niepewnością?