2012-02-13 71 views
1

類方法我想用一個類方法的信號方法不能調用C信號方法

signal(SIGALRM, syncro); 

Syncro的是另一個類方法的名稱。

void states::syncro(int parameter) 
{ 

} 

我嘗試用syncro&syncrostates::syncro,並&states::syncro但它們都在編譯時拋出的錯誤消息。

error: argument of type ‘void (states::)(int)’ does not match ‘void (*)(int)’ 
+0

你需要一個這個指針來調用一個類成員函數。信號使用c調用約定,這可能也是一個問題。 – Kevin 2012-02-13 18:10:07

+0

[使用C++類成員函數作爲C回調函數](http://stackoverflow.com/questions/1000663/using-a-c-class-member-function-as-a-c-callback-function) – 2012-02-13 18:11:21

回答

3

您可以調用只有自由函數或靜態類函數在這種情況下

signal的簽名是

typedef void (*sighandler_t)(int); 
sighandler_t signal(int signum, sighandler_t handler); 

這意味着,只接受指針free函數或靜態功能。

注意,你應該始終有一個對象調用成員功能,比方說,如果你有

struct S 
{ 
    void method(); 
} 
S obj; 

,你只能叫obj.method(),但從來沒有S::method()method()和指針S::method有型號void (S::*)()

但是,如果您的S::method()被宣佈爲靜態,您可以使用S::method()來調用它。

這就是爲什麼指向自由函數的指針與指向成員函數的指針不兼容的原因。