C++ 当我将方法作为参数传递时,如何忽略作用域?

C++ 当我将方法作为参数传递时,如何忽略作用域?,c++,C++,我有一个类SFAPin,有一个方法: SFAPin::addListener(void (*)(SFAPinEvent&), uint8_t){}; 但当我尝试为该方法传递另一个类的一个方法时: void InitialState::lightChange(SFAPinEvent &event){}; light.addListener(&this->lightChange, SFAPinEvent:PIN_CHANGE); 我得到: 错误:没有用于调用“SF

我有一个类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\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
);