このような問題を解決する必要があります。 基本クラスと2つの継承クラスがあります。基本クラスには、関数ポインタをパラメータとして必要とするメソッドが含まれています。しかし、そのような関数は継承クラスで定義されています。メンバ関数のポインタと継承
エラーC2664: 'にCBase :: WaitEventは':「ブール(__thiscall CChildA :: *)(空)からパラメータ1を変換することはできません
class CBase; typedef bool (CBase::*FPredicate)(); class CBase { public: CBase() {} ~CBase() {} protected: //this method waits until 'predicate' is true or until 'timeout' ms. passed //and returns true if 'predicate' is true eventually bool WaitEvent(FPredicate predicate, int timeout) { bool result = false; int time1 = GetTickCount(); int time2; bool isEnd = false; while(!isEnd) { result = isEnd = (this->*predicate)(); time2 = GetTickCount(); if(time2 - time1 > timeout && !isEnd) isEnd = true; } return result; } }; class CChildA : public CBase { protected: bool a1() {/*some work*/} bool a2() {/*some work*/} void a_main() { ... WaitEvent(&CChildA::a1, 100); ... WaitEvent(&CChildA::a2, 100); ... } }; class CChildB : public CBase { protected: bool b1() {/*some work*/} bool b2() {/*some work*/} void b_main() { ... WaitEvent(&CChildB::b1, 100); ... WaitEvent(&CChildB::b2, 100); ... } };
MSVC 2005コンパイラはWaitEventにエラーが呼び出しています'〜' FPredicate '
質問はどうすればコードを変更して正常に動作させることができますか? WaitEventコールを WaitEvent((FPredicate)(&CChildA::a1), 100)
と書き換えても安全ですか?
この場合、コンパイラはエラーを通知しますが、安全ですか?それとも、問題を解決する良い方法がありますか?
ありがとうございます。
boostまたはstd :: tr1を使用できますか?その場合、関数を使用し、派生クラスではbind()をメンバ関数 –
stijn
@stijnで使用します。C++ 11はライブであり、 'bind()'はすでに 'std ::'にあります。 。そして、一般的には、-std = C++ 0xを使用することが有益です。これは、日々のプログラミングに役立つ小さな機能が既に使用可能であるためです。 – Griwes
基本クラスの仮想派生クラスで呼び出し可能な関数を作成できますか? –