删除所有typdefs之后,我有以下声明:

class Message {
  protected:
    Message* (*factories[N])(HardwareSerial);
    ...
}

class DebugMessage : Message {
  protected:
    Message* receive(HardwareSerial serial);
    ...
  public:
    DebugMessage(char* message);
    ...
};

Message* DebugMessage::receive(HardwareSerial serial){...}

DebugMessage::DebugMessage(char* message){
  ...
  factories[DEBUG_MESSAGE] = &DebugMessage::receive;
  ...
}


但是,当我尝试编译它时,我在作业中指出了错误

debugMessage.cpp: In constructor ‘DebugMessage::DebugMessage(char*)’:
debugMessage.cpp:4:28: error: cannot convert ‘Message* (DebugMessage::*)(HardwareSerial)’ to ‘Message* (*)(HardwareSerial)’ in assignment
   factories[DEBUG_MESSAGE] = &DebugMessage::receive;

最佳答案

您需要更具体地说明需要存储在数组中的函数指针的确切类型:

class Message {
  protected:
    Message* (DebugMessage::*factories[N])(HardwareSerial);
    ...
}


更新(更多细节)

澄清数据类型的原因是成员函数有一个额外的(隐藏的)第一参数this,编译器在通过函数指针进行调用时必须知道该参数。

不得不说的是,我必须指出static成员函数没有该限制(因为它们没有this参数),并且可以在这方面与自由函数“自由混合”

07-24 09:46