删除所有typdef后,我有以下声明:
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;
答案 0 :(得分:3)
您需要更加具体地说明需要存储在数组中的函数指针的完全类型:
class Message {
protected:
Message* (DebugMessage::*factories[N])(HardwareSerial);
...
}
更新(更多细节)
数据类型澄清的原因是成员函数有一个额外的(隐藏的)第一个参数this
,编译器在通过函数指针调用它时必须知道它。
话虽如此,我必须指出static
成员函数没有这个限制(因为他们没有this
参数)并且可以"自由混合&#34 34;在这方面具有免费功能
答案 1 :(得分:1)
@YePhlcK解释了您遇到问题的原因,但我不知道他发布的代码确实解决了这个问题。我认为您只能将DebugMessage
成员函数的指针添加为使用它的工厂。我修改了您的代码,以便编译并使用std::function
和std::bind
来获取指向成员函数的函数指针。
#include <functional>
class HardwareSerial {};
class Message {
public:
using Reciever = Message*(HardwareSerial);
protected:
std::function<Reciever> factories[10];
};
class DebugMessage : Message {
protected:
Message* receive(HardwareSerial serial);
public:
DebugMessage(char* message);
};
Message* DebugMessage::receive(HardwareSerial serial){ return nullptr; }
DebugMessage::DebugMessage(char* message){
factories[0] = std::bind(&DebugMessage::receive, this, std::placeholders::_1);
}
这样,您可以在数组中使用成员函数和非成员函数以及lambda和函数对象。您只需要将std::bind
与成员函数一起使用。