Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::在模板函数中排序_C++_Templates - Fatal编程技术网

C++ std::在模板函数中排序

C++ std::在模板函数中排序,c++,templates,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_ea

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

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;
}
模板
列表f(列表和列表),
无效(*op)(列表和,列表和)
{
列表::迭代器itr=lst.begin();
整数计数=0;
对于每个(lst.begin(),lst.end(),
[&count](列表l){count+=l.size();});
列表(计数);
res.insert(res.end(),itr->begin(),itr->end());
排序(res.begin(),res.end());
返回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>'
错误C2784:“未知类型”std::operator-(std::move\u迭代器&,const
std::move_iterator&'):无法推断的模板参数
“std::move_iterator&”来自“std::_List_iterator”
我试着打电话

sort<T>(res.begin(), res.end());
排序(res.begin(),res.end()); 但我得到了信息:

cannot convert parameter 1 from 'std::_List_iterator<_Mylist>' to 'int'
无法将参数1从'std::_List_iterator'转换为'int'
您不能在
std::list
上使用,因为
list
不是随机访问(更具体地说,它的迭代器不是)

如果要对
列表进行排序
,请改用其成员函数:

list res(计数);
res.insert(res.end(),itr->begin(),itr->end());
res.sort();

虽然我无法告诉您这些特定错误消息的原因,但我可以告诉您的是,
std::sort
需要随机访问迭代器,而
std::list::iterator
则不是这样

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


实际上,第一条错误消息并不难理解。该实现尝试对两个列表迭代器进行减法运算,但没有运算符执行该操作。ADL将
std
名称空间引入搜索,编译器找到了
操作符-
的重载,以减去两个
std::move_迭代器(随机迭代器),但模板类型
\u RanIt
处于不可推断的上下文中,因此失败。只需关注核心问题:编译器无法找到有效的
运算符-

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

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

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

,非常感谢。猜测C++是一种语言,它在开始编写模板之前需要一些阅读:
template <typename Iterator>
std::sort(Iterator begin, Iterator end);
template <>
std::sort(int begin, int end)