【问题标题】:C++ template won't accept iteratorsC++ 模板不接受迭代器
【发布时间】:2012-07-20 17:28:39
【问题描述】:

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

【问题讨论】:

  • “并处理产生的不确定性” - 不应该有任何产生的不确定性:随机访问迭代器的概念被设计为足以对某些东西进行排序,你正在对某些东西进行排序,所以你应该需要知道的是您有一个随机访问迭代器。无论是否有容器支持,快速排序都没有关系。

标签: c++ templates iterator quicksort


【解决方案1】:

编译器无法从您的函数调用中推断出T。想想当std::vector&lt;T&gt;::iteratorT* 时会发生什么:

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

一般情况下,如果你写typename Something&lt;TemplateParameter&gt;::anotherThing,那么TemplateParemter在调用中是无法推导出来的。必须明确提供

QSort<int>(b, e);

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

【讨论】:

  • 谢谢,这一切看起来很愚蠢,现在已经向我解释了。看起来回到编写工作程序还有很长的路要走......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2014-01-18
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多