2016-11-21 5 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 ::演算子 - (STD :: move_iterator < _RanIt> &、constのはstd :: move_iterator < _RanIt2> &)':「STDのためのテンプレート引数を推定できなかった:: std :: _ List_unchecked_iterator >>誰が助けることができる '

」から' move_iterator < _RanIt> &?

+0

[mcve]を入力してください。私はあなたのコードを理解していません。例えば'operator'では'child'リストをソートしますが、' child'パラメータは 'const'です – user463035818

+2

' child.getList() 'は値を返します。したがって' child.getList()。begin() 'と' child.getList()。end() 'は2つの異なるコンテナのイテレータです – user463035818

+0

最初のエラーメッセージまたは最後のエラーメッセージを提供していますか?最初の方が重要です。 – aschepler

答えて

3

std::sortdocumentationで指定されているように、ランダムアクセスイテレータが必要です。std::listは提供していません。

Functor functor; 
auto list = child.getList(); 
list.sort(functor); 

注:でも、あなたは、コンテナを使用している場合は、あなたの方法は動作しませんランダムアクセスイテレータ、あなたは新しいコピーを作成child.getList()呼び出すたびにサポートし、std::listはそうソリューションが可能性が独自の方法std::list::sortのしている理由です2つの異なるインスタンスでbegin()end()を呼び出すためにUBを取得しますか?あなたのアイデアは、データメンバーを並べ替えることだった場合、あなたは良いアイデアではなく、技術的に働くだろう参照することによってそれを返す必要があります。

// if getList() returns reference this would work 
Functor functor; 
child.getList().sort(functor); 

が、より良いあなたがMotherClassの方法にファンクタを渡す、それはだ並べ替えることになります データ。

関連する問題