[英]Unresolved external symbol, with home-made delegate
我有一個函數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)
*函數typedef包含__stdcall
因為它是從(並將回調)C#傳入的
您需要定義類的static
成員一次(例如在Delegate.cpp中):
FuncCallBack Delegate::_Callback;
在發布的代碼中只有_Callback
的聲明。
正如我在評論中指出的那樣,使用類使得看起來你已經將回調函數包裝在類實例中,但由於回調函數是一個原始函數指針,它無法從類實例訪問任何狀態從...獲取。 它只能訪問靜態成員變量,這意味着每當構造新的Delegate
實例時, 所有 Delegate
實例的行為。
如果你必須支持調用不同的func
我會使用一個更簡單的接口,這個接口使得只有回調函數一次處於活動狀態。
例如:
callbackwrapper.h
:
void CallbackWrapper(int, int*);
void SetWrappedCallback(void (__stdcall *toWrap)(int));
callbackwrapper.cpp
:
namespace {
void (__stdcall *wrappedCallback)(int);
}
void CallbackWrapper(int a, int*)
{
wrappedCallback(a);
}
void SetWrappedCallback(void (__stdcall *toWrap)(int))
{
wrappedCallback = toWrap;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.