2

次の定義とプロトタイプ (クラスのメンバー関数) を使用して、基本的に関数ポインターを使用して、異なるタイプの戦略をdivideQuery メソッドに渡します。

typedef vector<ConstraintManager> (*strategyType1)(const Query&);
typedef vector<ConstraintManager> (*strategyType2)(const Query&, int);

vector<ConstraintManager> divideQuery (strategyType1 s, const Query& query);
vector<ConstraintManager> divideQuery (strategyType2 s, const Query& query, int parts);

vector<ConstraintManager> divideByHalf(const Query& query);
vector<ConstraintManager> divideRandom(const Query& query);
vector<ConstraintManager> divideByN(const Query& query, int n);

ただし、呼び出しようとすると(queryパラメーターはラッピング関数から渡されます):

vector<ConstraintManager> result =  divideQuery(divideRandom, query);

次のエラー メッセージで失敗します。

DividingSolver.cpp:200:70: error: no matching function for call to ‘DividingSolver::divideQuery(<unresolved overloaded function type>, const klee::Query&)’
DividingSolver.cpp:82:27: note: candidates are: std::vector<klee::ConstraintManager>   DividingSolver::divideQuery(std::vector<klee::ConstraintManager> (*)(const klee::Query&),  const klee::Query&)
DividingSolver.cpp:87:27: note: std::vector<klee::ConstraintManager>     DividingSolver::divideQuery(std::vector<klee::ConstraintManager> (*)(const klee::Query&, int), const klee::Query&, int)

Web から読む限り、過負荷エラー (または他の何か) のように見えますが、いずれにせよ、正確に何が間違っているのかよくわかりません。ヒント/説明をいただければ幸いです。

乾杯

4

2 に答える 2

5

問題は、非静的メンバー関数がフリー関数と同じシグネチャを持たないことです。特に、隠し thisポインタがあります。これで、最初の引数がメンバー関数へのポインターである場所への呼び出しができましたdivideQueryが、メンバー関数へのポインターを受け取るオーバーロードがないため、コンパイラーはエラー メッセージを出して救済します。

関数がクラスの状態を使用しない場合は、それらを作成できます。これstaticにより、暗黙的なものが削除され、機能thisするはずです。divideQuery別のオプションは、実際にはインターフェイス内のメンバーへのポインターを使用することです。3 番目のオプションは、関数の引数にstd::function<>(または) のような高レベルの構成を使用し、 ( ) を使用して引数をバインドすることです。boost::function<>std::bindboost::bindthis

于 2012-07-09T21:57:07.323 に答える
4

静的divideRandomにすると、通常の関数ポインターと互換性があります。

于 2012-07-09T21:53:34.230 に答える