C++ 当我将方法作为参数传递时,如何忽略作用域?
我有一个类SFAPin,有一个方法:C++ 当我将方法作为参数传递时,如何忽略作用域?,c++,C++,我有一个类SFAPin,有一个方法: SFAPin::addListener(void (*)(SFAPinEvent&), uint8_t){}; 但当我尝试为该方法传递另一个类的一个方法时: void InitialState::lightChange(SFAPinEvent &event){}; light.addListener(&this->lightChange, SFAPinEvent:PIN_CHANGE); 我得到: 错误:没有用于调用“SF
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\u 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,将成员函数调整为所需的签名。 e、 g 细节 或者,在C++11中使用lambdas
addListener(
[&] (SFAPinEvent &event)
{
lightChange(event);
},
SFAPinEvent:PIN_CHANGE
);
更多细节
静态文件被编译是因为
“静态成员函数不要求创建实际对象
调用,因此指向静态成员函数的指针通常是
类型与指向函数的常规指针兼容。“(来自)
它不仅仅是作用域,它是一种完全不同的函数类型。您需要决定是否需要对
InitialState
对象调用函数lightChange
(它是否使用其中的值?)。InitialState扩展了SFAState并且工作良好SFAPin::addListener(void(SFAState::*)(SFAPinEvent&),uint8_t)谢谢:D
addListener(
[&] (SFAPinEvent &event)
{
lightChange(event);
},
SFAPinEvent:PIN_CHANGE
);