我正在重新学习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:\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 ===|
似乎编译器无法解析T应该是什么。有没有办法做我正在尝试做的事情,或者我应该将参数声明为类型T,并使用由此产生的不确定性?
答案 0 :(得分:5)
编译器无法从函数调用中推导出T
。想想std::vector<T>::iterator
T*
时会发生什么:
int *b = ...;
int *e = ...;
QSort(b, e);
通常,如果您撰写typename Something<TemplateParameter>::anotherThing
,则无法在通话中推断出TemplateParemter
。必须明确提供
QSort<int>(b, e);
我建议只使用T
作为参数类型。这样您不仅可以接受向量迭代器,还可以接受T*
或std::deque<T>::iterator
以及任何其他随机访问迭代器。