C++模板不接受迭代器
C++ template won't accept iterators
我正在重新学习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>::iterator
是T*
:时会发生什么
int *b = ...;
int *e = ...;
QSort(b, e);
通常,如果编写typename Something<TemplateParameter>::anotherThing
,则无法在调用中推导出TemplateParemter
。必须明确提供
QSort<int>(b, e);
我建议只使用T
作为参数类型。这将使您不仅可以接受向量迭代器,还可以接受T*
或std::deque<T>::iterator
以及任何其他随机访问迭代器。
相关文章:
- 为什么范围算法与 std 的迭代器不兼容?
- 矢量迭代器不能与 std::shared_ptr<> 取消引用
- forward_list迭代器不兼容
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++,弹出调试断言失败窗口,我得到矢量迭代器不兼容的错误运行时
- f.getline() 迭代器不增加
- 当我发生碰撞检测时,矢量迭代器不兼容
- 为什么C++字符串迭代器不检查错误?
- debug断言矢量迭代器不可用find_if删除
- 为什么标准容器迭代器不会重载"->*"?
- 为什么反向迭代器不是 C++17 标准下的正式迭代器类别?
- C XTREE崩溃在出口上,映射/设置迭代器不可用
- C++:为什么输出迭代器不支持比较操作?
- 迭代器不兼容错误
- C++向量迭代器不是增量的
- 为什么更多的迭代器不是随机访问?
- 为什么迭代器不返回集合的开头
- 字符串迭代器不兼容错误,当我将字符串转换为矢量<byte>时
- 迭代器不能被另一个相同大小的向量重用吗?
- 字符串迭代器不可用C 问题