std :: sort在模板函数中

时间:2013-11-12 18:09:50

标签: c++ templates

这是我的代码中不起作用的部分:

template<typename T>
list<T> f(list<list<T> >& lst,
          void (*op)(list<T>&, list<T>&))
{
    list<list<T> >::iterator itr = lst.begin();

    int count = 0;
    for_each(lst.begin(), lst.end(),
             [&count](list<T> l){ count += l.size(); });

    list<T> res(count);
    res.insert(res.end(), itr->begin(), itr->end());

    sort(res.begin(), res.end());

    return res;
}

VS2012编译器说错误C2784:

error C2784: ''unknown-type' std::operator -(std::move_iterator<_RanIt> &,const 
std::move_iterator<_RanIt2> &)' : could not deduce template argument for 
'std::move_iterator<_RanIt> &' from 'std::_List_iterator<_Mylist>'

我试着打电话

sort<T>(res.begin(), res.end());

但收到了消息:

cannot convert parameter 1 from 'std::_List_iterator<_Mylist>' to 'int'

2 个答案:

答案 0 :(得分:4)

虽然我无法告诉您为什么会出现这些特定的错误消息,但我可以告诉您std::sort需要随机访问迭代器,std::list<>::iterator不是这样。

您可以使用std::list<>::sort()


实际上第一条错误信息并不难理解。实现尝试减去两个列表迭代器,并且没有运算符来执行此操作。 ADL将std命名空间带入搜索,编译器发现operator-的重载减去了两个std::move_iterator<>(随机迭代器),但模板类型_RanIt位于不可推翻的背景,但失败了。只关注核心问题:编译器找不到有效的operator-

第二条错误消息与您提供了错误的模板参数有关。 std::sort模板的类型参数是迭代器类型,签名是:

template <typename Iterator>
std::sort(Iterator begin, Iterator end);

当您提供T(在这种情况下似乎是int)时,编译器会生成专门化:

template <>
std::sort(int begin, int end)

但是在你的调用中,你试图传递std::list<int>::iterator作为参数,编译器无法将其转换为int

答案 1 :(得分:3)

您无法在std::list上使用std::sort,因为list不是随机访问(更具体地说,其迭代器不是RandomAccessIterators)。

如果要对list进行排序,请改用其成员函数std::list<T>::sort()

list<T> res(count);
res.insert(res.end(), itr->begin(), itr->end());
res.sort();