以下のような関数ポインタ宣言があります。
int Start(char* pName, void (*callback)(void *));
以下のように関数ポインタを渡す場合:
Start("Name", &Service::callbackStatus(void*));
次のエラーが表示されます:
エラー: 'void' の前にプライマリ式が必要です。
何が問題ですか?
以下のような関数ポインタ宣言があります。
int Start(char* pName, void (*callback)(void *));
以下のように関数ポインタを渡す場合:
Start("Name", &Service::callbackStatus(void*));
次のエラーが表示されます:
エラー: 'void' の前にプライマリ式が必要です。
何が問題ですか?
関数への関数ポインタを渡すときは、関数名を渡すだけです。
Start("Name", &Service::callbackStatus);
関数ポインタの受け渡しは、次の方法で実行できます。
int Start( char* pName, void (Service::* callback)(void *), Service& obj )
{
(obj.*(callback))( pName );
return 0;
}
...
Service obj;
Start( "Name", &Service::callbackStatus, obj );
しかし、それは醜い方法です。
C++ では、インターフェイスのポインタまたは参照を関数に渡す方がより洗練されています。
class MyInterface
{
public:
virtual void callbackStatus(void* a) = 0;
};
class Service : public MyInterface
{
public:
void callbackStatus(void* a) { std::cout << "hello\n"; }
};
int Start( char* pName, MyInterface& obj )
{
obj.callbackStatus( pName );
return 0;
}
...
Service obj;
Start( "Name", obj );
別の方法は、静的メンバー関数へのポインターを渡すことです。通常の非メンバー関数と同様の方法で使用できます。