C++模板不接受迭代器

C++ template won't accept iterators

本文关键字:迭代器 不接受 C++      更新时间:2023-10-16

我正在重新学习C++,并开始尝试一种简单的算法:QuickSort。我的函数有这个签名:

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

它在我的主要函数中被调用:

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;
}

并给出以下错误:

C:UsersDeusProjectsQSortmain.cpp||In function 'int main()':|
C:UsersDeusProjectsQSortmain.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 ===|

编译器似乎在解决T应该是什么时遇到了问题。有没有一种方法可以完成我想要做的事情,或者我应该将参数声明为类型T,并处理由此产生的不确定性?

编译器无法从函数调用中推导出T。想想当std::vector<T>::iteratorT*:时会发生什么

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

通常,如果编写typename Something<TemplateParameter>::anotherThing,则无法在调用中推导出TemplateParemter。必须明确提供

QSort<int>(b, e);

我建议只使用T作为参数类型。这将使您不仅可以接受向量迭代器,还可以接受T*std::deque<T>::iterator以及任何其他随机访问迭代器。