函数指针不分配到函数指针数组中

时间:2014-06-29 22:14:01

标签: c++ function-pointers

删除所有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;

2 个答案:

答案 0 :(得分:3)

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

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

更新(更多细节)

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

话虽如此,我必须指出static成员函数没有这个限制(因为他们没有this参数)并且可以"自由混合&#34 34;在这方面具有免费功能

答案 1 :(得分:1)

@YePhlcK解释了您遇到问题的原因,但我不知道他发布的代码确实解决了这个问题。我认为您只能将DebugMessage成员函数的指针添加为使用它的工厂。我修改了您的代码,以便编译并使用std::functionstd::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与成员函数一起使用。