不合格或带括号的非静态成员函数,以形成指向成员函数的指针

时间:2015-08-21 14:13:52

标签: c++ pointers

我正在使用一个将“指向函数的指针”作为变量的函数,但是程序失败并出现以下错误:

EventCreatorBase.h:215:52:错误:ISO C ++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针。说'& EventCreatorBase :: generateExceptionEvent'

class ExceptionEvent {

 public:

    void cellEvent::generateEvents(const unsigned long* event, void(*overflowCallbackFn)(unsigned int));

};

class EventCreatorBase{ 
  public:
     void generateExceptionEvent(unsigned int);
     ..
     void fun1()
     {
       ...
       ExceptionEvent event1;
       const unsigned long* eventCounter;
       ..
       event1.generateEvents(eventCounter, &generateExceptionEvent); //EventCreatorBase.h 215
     }


};

2 个答案:

答案 0 :(得分:0)

你不能将成员函数指针转换为函数指针,顺便说一句,你的代码是错误的。 应该像

event1.generateEvents(eventCounter, &EventCreatorBase::generateExceptionEvent);

但它也不起作用,因为你不能将成员函数指针转换为函数指针。将std::functionstd::bind一起使用的最佳方式。

void cellEvent::generateEvents(const unsigned long* event,
const std::function<void(int)>&);

然后只是

event1.generateEvents(eventCounter,
std::bind(&EventCreatorBase::generateExceptionEvent, this, std::placeholders::_1));

如果你不能使用C ++ 11 - 你可以使用boost :: function / boost :: bind。

答案 1 :(得分:0)

这里有2个问题: 一个。函数指针参数的语法错误 - 您说它是一个常规函数指针,但您希望它是一个类成员指针。你需要使用类名(这意味着你需要前向声明的类) 湾编译器正在准确说明第二个错误需要修复的内容。