Как хранить / использовать внешние указатели на функции внутри вектора класса - PullRequest
1 голос
/ 27 апреля 2019

Я использую vector в классе для хранения тем MQTT и указателей на внешние функции , которые обрабатывают сообщения MQTT для каждой темы. Я использую typedef для определения указателей на функции обратного вызова mqtt вне класса и использую этот typedef в структуре, которая определяет объекты vector.

Однако я получаю сообщение об ошибке компиляции: _'mqttCallback_t 'не был объявлен_, когда я пытаюсь использовать typedef для определения указателя функции в функции-члене, которая будет добавлять объекты в вектор.

void addSubscription(char* topic, mqttCallback_t* cback) {

Я надеюсь, что кто-то может объяснить, почему компилятор генерирует это сообщение, и что нужно сделать, чтобы следующий код работал.

// define pointer to an MQTT callback function that is external to the class
typedef void (*mqttCallback_t)(char*, byte*, unsigned int); 

class MqttClient{
    struct MqttSubscription {
        char topic[64];
        mqttCallback_t* callback;
    };
  private:
    byte brokerIP[4];
    uint16_t maxPacketLength;   
    bool sessionActive;
    std::vector<MqttSubscription> subList;
  public:
    void addSubscription(char* topic, mqttCallback_t* cback) {
        MqttSubscription sub;
        strncpy(sub.topic, topic, sizeof(sub.topic));
        sub.callback = cback;
        this->subList.push_back(sub);
    }
);

1 Ответ

0 голосов
/ 02 мая 2019

Оказалось, проблема с компилятором:

Препроцессор объявлял класс вперед. Другими словами, компилятор пытался скомпилировать класс перед typedef.

Перемещение typedef в файл .h решило проблему.

Спасибо тем, кто добавил комментарии.

...