C++ 模板不接受迭代器

标签 c++ templates iterator quicksort

我正在重新学习 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,并处理由此产生的不确定性?

最佳答案

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

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

一般来说,如果你写typename Something<TemplateParameter>::anotherThing , 然后是 TemplateParemter不能在通话中推导出来。必须明确提供

QSort<int>(b, e);

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

关于C++ 模板不接受迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11596257/

相关文章:

c++ - std::set 包含对与自定义​​比较器

c++ - 与 std::inserter 相比,std::back_inserter 有什么好处?

c++ - LAMBDA错误: conditional expression of type 'void' is illegal

c++ - 获取 map 数组的长度

c++ - 类模板特化中的成员变量别名

c++ - 为什么我无法将 std::make_unique<S> 作为函数参数传递?

c++ - 是什么导致该张量外积中出现无限模板递归?

c++ - std::list.end() 不返回 "past-the-end"迭代器

c++ - 当需要访问容器时返回迭代器而不是底层容器本身

c++ - 混合 std::wcout 和 std::cout 会出错,有什么问题吗?