2013-07-26 21 views
0

我有一类SFAPin,并有一个方法:当我将方法作为参数传递时,如何忽略范围?

SFAPin::addListener(void (*)(SFAPinEvent&), uint8_t){}; 

但是,当我试图通过另一个类此方法的一种方法:

void InitialState::lightChange(SFAPinEvent &event){}; 

light.addListener(&this->lightChange, SFAPinEvent:PIN_CHANGE); 

我:
错误:没有用于调用'SFAPin :: addListener(void(InitialState :: *)(SFAPinEvent &),uint8_t'' )的匹配函数注:候选是:void SFAPin :: addListener(void(*)(SFAPinEvent &),uint8_t)

如果lightChange是一个静态方法效果很好用:

light.addListener(lightChange, SFAPinEvent:PIN_CHANGE); 

但我不希望有一个静态方法

我该如何解决呢? 谢谢

+0

这不是菊它是一个完全不同类型的函数。您需要决定是否需要在'InitialState'对象上调用'lightChange'函数(是否使用它内部的值?)。 – BoBTFish

回答

0

参数addListener()预计,是指针功能。您传入的参数是指向成员函数的指针。您可以通过传递一个函数或通过添加一个方法,它需要一个指向成员函数

SFAPin::addListener(void (InitialState::*)(SFAPinEvent&), uint8_t) 

但后来解决这个问题,还必须添加一个对象指针,它可以与给定的方法一起使用,也许类似于

SFAPin::addListener(InitialState &state, void (InitialState::*)(SFAPinEvent&), uint8_t) 
+0

InitialState扩展了SFAState并且很好地工作 SFAPin :: addListener(void(SFAState :: *)(SFAPinEvent&),uint8_t) Thanks:D – wellfer123

0

另一种方法是使用bind或lambda来将成员函数调整为所需的签名。 例如

bind(&InitialState::lightChange, this, _1); 

详细here

或者,使用lambda表达式在C++ 11个

addListener(
    [&] (SFAPinEvent &event) 
    { 
    lightChange(event); 
    }, 
    SFAPinEvent:PIN_CHANGE 
); 

更多细节here

静态编译,因为

"static member functions do not require an actual object to be invoked, so pointers-to-static-member-functions are usually type-compatible with regular pointers-to-functions." (from here)

相关问题