2016-11-21 83 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的方法,這將對其進行排序的 數據。

相關問題