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)