2

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

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'
4

2 回答 2

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.

于 2013-11-12T18:14:01.437 回答
3

您不能std::sort在 a 上使用,std::list因为 alist不是随机访问(更具体地说,它的迭代器不是RandomAccessIterators)。

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

list<T> res(count);
res.insert(res.end(), itr->begin(), itr->end());
res.sort();
于 2013-11-12T18:13:29.230 回答