2011-12-08 4 views
2

私はこの問題を正しく使用しているかのように感じますが、コンパイラはそれ以外の場合は感じます。私はソートアルゴリズムを使用して私のsort_by_name関数でアルファベット順にコースのリストをソートしようとしています。これは私が書いたものをざっとです:STL-ソートが正常に動作しない

class SomeClass { 
    private: 
    struct course { 
     string id, name; 
    }; 
    vector<course> COURSES; 
    bool nameCmp(course a, course b) {return (a.name > b.name) ? true : false;} 
    public: 
    void sort_by_name() { 
     sort(COURSES.begin(), COURSES.end(), nameCmp); 
    } 
}; 

エラー:任意の助けを事前に

error: no matching function for call to ‘sort(std::vector<SomeClass::course>::iterator, std::vector<SomeClass::course>::iterator, <unresolved overloaded function type>)’ 

感謝。

答えて

8

変更し、これに機能:

static bool nameCmp(course a, course b) { return a.name > b.name; } 

さらに良いことには、constの参照で引数を渡すことであろう、course const & aなど

+0

ラブリー、ありがとう。 – kladd

-1

sortアルゴリズムからnameCmp関数を呼び出すするつもりはありませんオブジェクトまたはクラスとの関連では、グローバル名前空間から呼び出すことになります。あなたはそれを自由な機能にするか、それを静的にしてSomeClass::nameCmpを使用する必要があります。

+1

いいえ、名前空間はこれとは関係がありません。なぜなら、暗黙の 'this'パラメータのためにメンバー関数を' std :: sort'の比較者として使うことができないからです。 –

+0

@EtiennedeMartel、私はあなたが私のことを誤解していたと思う。この関数は 'object-> nameCmp'のようにオブジェクトから呼び出されず、' class :: nameCmp'のようにクラスの観点から呼び出されません。恐らくネームスペースは間違った用語でしたが、私はより良いものを持っていません。暗黙の 'this'パラメータは、オブジェクトメンバ関数と呼ばれるもう一つの言い方であり、それを置くためのもっと混乱する方法です。 –

+0

あなたはクラス名を指定する必要はありません。別のクラスの静的メソッドを参照する必要がありますが、メソッドの中にいるときは名前だけが必要です。ケレックの答えは正しい。 –

2
 bool SomeClass::nameCmp(course a, course b) {return (a.name > b.name) ? true : false;} 

暗黙のSomeClass *thisパラメータがあります。宣言を移動するか、またはstaticにすることによって、クラスの外にメソッドを作成します。

関連する問題