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);

但我不想要静态方法

我该如何解决?谢谢

4

2 回答 2

0

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

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

详情在这里

或者,在 C++11 中使用 lambda

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

更多细节在这里

静态编译是因为

“静态成员函数不需要调用实际对象,因此指向静态成员函数的指针通常与常规指向函数的指针类型兼容。” (从这里

于 2013-07-26T08:45:49.720 回答
0

参数addListener()期望是一个指向函数的指针。您传入的参数是指向成员函数的指针。您可以通过传递函数或添加方法来解决此问题,该方法需要指向成员函数的指针

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

但是,您还必须添加一个对象指针,它可以与给定的方法一起使用,可能类似于

SFAPin::addListener(InitialState &state, void (InitialState::*)(SFAPinEvent&), uint8_t)
于 2013-07-26T08:21:25.977 回答