当我把一个方法作为参数传递时,我怎么能忽略作用域呢
How can I ignore scope when I pass a method as parameter?
我有一个类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
);
更多详情点击此处
静态编译是因为
"静态成员函数不需要实际对象调用,所以指向静态成员函数的指针通常与指向函数的常规指针兼容的类型。"(从这里)
相关文章:
- 为什么我不能将引用作为 std::async 的函数参数传递
- 我怎么能有一个以2D数组为参数的函数,而数组有一个我想更改的参数/维度
- C++ _beginthread不能将字符串作为参数传递
- 为什么模板函数不能作为模板模板参数传递?
- 为什么当数组作为调用方函数中的参数传递时,不能在被调用函数中使用 foreach 循环打印数组的值
- std :: string =操作员不能将0作为参数传递
- 你能把一个额外的参数传递给谓词吗?
- C++ 不能将公共 const 字符串成员作为参数传递给同一类的成员函数
- 为什么在传递给参数时不能隐式构造给定合适构造函数的对象?
- 不能将向量作为参数 c++ 传递
- 当我把一个方法作为参数传递时,我怎么能忽略作用域呢
- 你怎么能一次给一个函数一个参数呢
- 不能将可变参数传递给嵌套可变模板调用
- 不能将指针作为参数传递给另一个函数
- 为什么结构不能作为值作为模板非类型参数传递?
- 我怎么能得到QT主函数argv参数作为unicode编码格式
- 为什么数组不能作为函数参数传递?
- COM服务器作为windows服务,不能将数组作为函数参数传递
- 不能正确识别作为构造函数参数传递的函数
- 为什么用A{8}初始化的对象不能作为参数传递