使用c ++中的自定义函子对数组进行排序,其中母类是通用的

时间:2016-11-21 17:22:28

标签: c++ list sorting functor

所以我想使用对象仿函数从子级对母类中的数组进行排序。母班是通用的。

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

有人可以帮忙吗?

1 个答案:

答案 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的方法,它会对它进行排序 数据