2012-07-21 108 views
1

我正在重新学习C++,并开始尝试应该是一个简单的算法:QuickSort。我的功能有这样的签名:C++模板不会接受迭代器

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

“并处理由此产生的不确定性” - 不应该有任何结果的不确定性:随机访问迭代器概念被设计为足以对某物进行排序,您正在排序某些内容,所以您应该知道的是你有一个随机访问迭代器。快速排列无论是否由容器支持都无关紧要。 – 2012-07-21 23:40:14

回答

5

编译器无法从函数调用中推导出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以及任何其他随机访问迭代器。

+0

谢谢,这一切似乎都很无聊,现在已经向我解释了。看起来这将是一个漫长的回写工作计划的道路...... – 2012-07-21 22:44:03