2016-11-21 80 views
0

所以我想使用对象函数对子类中的数组进行排序。母类是通用的。在C++中使用自定义函数对数组进行排序,其中母类是通用的

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: '未知类型的std ::运营商 - (标准:: move_iterator < _RanIt> &,常量的std :: move_iterator < _RanIt2> &)':不能推导出模板参数为“的std :: move_iterator < _RanIt“从 'STD> & :: _ List_unchecked_iterator >>'

任何人都可以帮忙吗?

+0

请提供[mcve]。我不明白你的代码。例如在'operator <<'中,您对'child'列表进行排序,但参数'child'是'const' – user463035818

+2

您的'child.getList()'返回一个值,因此'child.getList()。begin() '和'child.getList()。end()'是来自两个不同容器的迭代器 – user463035818

+0

您提供了第一条错误消息还是最后一条错误消息?第一个更重要。 – aschepler

回答

3

std::sortdocumentation所述,它需要随机访问迭代器,其中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); 

,但更好的传递函子来的MotherClass的方法,这将对其进行排序的 数据。

相关问题