我有一个类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);
但我不想要一个静态的方法
我该如何解决?感谢
addListener()
期望的参数是指向函数的指针。传入的参数是指向成员函数的指针。您可以通过传递一个函数或添加一个方法来解决此问题,该方法需要指向成员函数的指针
SFAPin::addListener(void (InitialState::*)(SFAPinEvent&), uint8_t)
但是,您还必须添加一个对象指针,它可以与给定的方法一起使用,可能类似于
SFAPin::addListener(InitialState &state, void (InitialState::*)(SFAPinEvent&), uint8_t)
另一种选择是使用bind或lambda,将成员函数调整为所需的签名。例如
bind(&InitialState::lightChange, this, _1);
此处为详细信息
或者,在C++11 中使用lambdas
addListener(
[&] (SFAPinEvent &event)
{
lightChange(event);
},
SFAPinEvent:PIN_CHANGE
);
更多详情点击此处
静态编译是因为
"静态成员函数不需要实际对象调用,所以指向静态成员函数的指针通常与指向函数的常规指针兼容的类型。"(从这里)