5

私はhttp://www.cplusplus.com/reference/algorithm/sort/を見ていて、似たようなものを実装したいと思っていました。提供されたリンクの例に示されてclauseComparatorいるような関数を定義しました。myfunc

bool QueryEvaluatorPrivate::clauseComparator(QueryClause cl1, QueryClause cl2) {
    int priority1 = clausePriority(cl1), 
        priority2 = clausePriority(cl2);
    return priority1 < priority2;
}

そして私はそれを次のように使用しました:

sort(clauses.begin(), clauses.end(), clauseComparator);

しかし、VSは不平を言います:

Error   4   error C3867: 'QueryEvaluatorPrivate::clauseComparator': function call missing argument list; use '&QueryEvaluatorPrivate::clauseComparator' to create a pointer to member   h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp  138
Error   5   error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp  138

まず、何が問題なのですか(引数リストがありません)?エラーで与えられた提案に従って追加しようとしましたが&、最終的には

Error   4   error C2276: '&' : illegal operation on bound member function expression    h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp  138
Error   5   error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp  138

ここで何が問題なのですか?私の理解では、それは私が理解している関数ポインタを渡す必要がありsortますか?

4

4 に答える 4

6

からアクセスできるようにするには、メンバー関数を静的にする必要がありますsort。クラスヘッダーで、次のように宣言してください。

static bool QueryEvaluatorPrivate::clauseComparator(const QueryClause & cl1, const QueryClause & cl2);

bindコンパレータはクラスメンバーにアクセスする必要がある可能性が高い(またはすべきではない)ため、を使用する必要はありません。

于 2013-03-13T12:35:31.060 に答える
1

このためにメンバー関数を使用することはできません。フリーclauseComparator関数またはstaticメンバー関数を作成します。

コンパレータは、const参照によって引数を取る必要もあります。

于 2013-03-13T12:35:29.953 に答える
0

を使用std::bindしてメンバー関数をバインドするstd::sort必要があります。そうしないと、メンバー関数をにバインドできません。std::sort

だからそれはこれを望みます:

 sort(clauses.begin(), clauses.end(), std::bind(&QueryEvaluatorPrivate::clauseComparator, instance, args));
于 2013-03-13T12:35:24.993 に答える