删除所有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
参数),并且可以在这方面与自由函数“自由混合”