这是我的代码中不起作用的部分:
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'
答案 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();