所以我想使用对象仿函数从子级对母类中的数组进行排序。母班是通用的。
template<typename T>
class MotherClass
{
public:
/* some code */
std::list<T*> getList();
private:
std::list<T*> list_;
}
子类使用另一个类作为模板
class OtherClass
{
public:
/* some code */
std::string getName() const;
private:
std::string name_;
}
这是仿函数类
class Functor
{
public:
/* some code */
bool operator() (OtherClass* a, OtherClass* b) const
{
return a->getName() < b->getName();
}
}
最后,这是子类
class ChildClass : public MotherClass<OtherClass>
{
public:
/* some code */
friend std::ostream& operator<<(std::ostream& o, const ChildClass& child);
}
std::ostream& operator<<(std::ostream& o, const ChildClass& child)
{
Functor functor;
std::sort(child.getList().begin(), child.getList().end(), functor);
/* some code */
}
当我在ChildClass中评论排序行时,解决方案构建没有任何问题。但是,当它出现时,就会发生这种错误。
错误C2784:'unknown-type std :: operator - (std :: move_iterator&lt; _RanIt&gt;&amp;,const std :: move_iterator&lt; _RanIt2&gt;&amp;)':无法推断'std :: move_iterator&lt的模板参数; _RanIt&GT; &安培;”来自'std :: _ List_unchecked_iterator&gt;&gt;'
有人可以帮忙吗?
答案 0 :(得分:3)
如std::sort
documentation所述,它需要随机访问迭代器,std::list
不提供。这就是为什么std::list
拥有自己的方法std::list::sort
所以解决方案可能是:
Functor functor;
auto list = child.getList();
list.sort( functor );
注意:即使你使用容器,它支持随机访问迭代器,你的方法也行不通,每次你调用child.getList()
你创建一个新副本,所以你会得到UB来调用begin()
和end()
在两个不同的实例上。如果你的想法是对数据成员进行排序,你需要通过引用来返回它,这不是一个好主意但技术上会起作用:
// if getList() returns reference this would work
Functor functor;
child.getList().sort( functor );
但最好将functor传递给MotherClass
的方法,它会对它进行排序
数据