Передача функции-члена класса в качестве аргумента
Мне нужно передать функцию-член класса в server.on, к сожалению, я получаю ошибку.
ошибка: нет соответствующей функции для вызова 'ESP8266WebServer::on
Я немного поискал, но не смог понять ничего, что нашел. Нет простого объяснения.
Это работает:
void handleRoot(){}
server.on("/", handleRoot);
Это не так:
void myClass::handleRoot(){}
void myClass::setup(){
server.on("/", handleRoot);
}
Вторым аргументом server.on является
typedef std::function<void(void)> THandlerFunction;
К сожалению, я понятия не имею, что это значит.
@Molda, 👍5
Обсуждение3 ответа
Лучший ответ:
Это довольно распространенный вопрос, связанный с программированием на C++.
Подробное объяснение можно найти здесь.
Краткий ответ: это сильно отличается от получения адреса обычной функции.
Обходные пути (которые могут работать, а могут и не работать, в зависимости от того, для чего еще вам нужна эта функция):
- сделать его статичным
- объявите ее как дружественную функцию, а не как функцию-член
В любом случае, дело в том, что это должно быть не что-то связанное с экземпляром класса, а скорее с классом в целом.
Статические работы. Надеюсь, я не столкнусь с еще одной проблемой, сделав ее статичной :) Большое спасибо., @Molda
Я столкнулся с той же проблемой.
Дальнейшие исследования синтаксиса C++ помогли мне найти это чистое решение, основанное на
Синтаксис std::bind:
server.on("/", std::bind(&myClass::handleRoot, this));
Если у вас установлена стандартная библиотека шаблонов, да., @Nick Gammon
Это выполнит свою работу — используя синтаксис анонимной функции:
server->on("/", [&]() {
handleRoot();
});
- esp32 Stack canary watchpoint срабатывает
- Преобразование byte* в int в Arduino
- Веб-сервер ESP8266 не отвечает (тайм-аут подключения)
- Прошивать NodeMCU с помощью .ino-файла?
- ESP8266 SPIFFS не сохраняется правильно?
- Ошибка «Неопределенная ссылка» во время компиляции для функций, определенных в исходном файле .cpp, которые вызываются в моем основном файле проекта
- C++ против языка Arduino?
- Как читать и записывать EEPROM в ESP8266
Похоже, это скорее вопрос C++, чем вопрос Arduino., @TheDoctor
@TheDoctor, вы, вероятно, правы, но я подумал, что, поскольку это связано с IDE Arduino, у кого-то может возникнуть такая же проблема., @Molda
На самом деле это не имеет ничего общего с IDE как таковой., @Ignacio Vazquez-Abrams
@Игнасио Васкес-Абрамс, поскольку я использую Arduino IDE для написания кода и загрузки его в свой esp8266, как это делают многие другие, это во многом связано с этим. Другие люди используют ту же библиотеку и поэтому могут столкнуться с той же проблемой. Кроме того, я очень ценю ваш полезный комментарий., @Molda
Это произойдет с любым редактором, инструментом загрузки или библиотекой. Это языковая проблема., @Ignacio Vazquez-Abrams