Foo
パラメータとして2パラメータ関数を取る関数があります:
void Foo(void (*fcn)(int, int*));
ただし、 ( ) で渡したい関数の型は、func
1 つのパラメーターのみを取ります*。
typedef void (__stdcall *FuncCallBack)(int a);
void Caller(FuncCallBack func) {
Foo(????);
}
C# では、次のようにします。
Foo((a,b) -> func(a));
デリゲート クラスで同様のことをしようとしています (バインドされたメンバー関数へのポインターを持つことができないことがわかったので、静的に切り替えました):
class Delegate {
private:
static FuncCallBack _Callback;
public
Delegate(FuncCallBack);
static void Callback(int, int*);
}
Delegate::Delegate(FuncCallback callback) { _Callback = callback; }
void Delegate::Callback(int a, int *b) { _Callback(a); }
私は次のように使用します:
void Caller(FuncCallBack func) {
Delegate d = Delegate(func);
Foo(&(d.Callback));
}
現在、これによりリンカーエラーが発生しています:unresolved external symbol "private: static void (__stdcall* Delegate::_Callback)(int)" (?_Callback@Delegate@@0P6GXHHPAN0@ZA)
- 質問 1: このリンカ エラーの原因は何ですか?
- 質問 2: これを行うためのより良い方法はありますか?
*関数 typedef は__stdcall
、C# から渡される (そして C# にコールバックする) ため、インクルードされます)。