Я писал класс веб-сокета и хотел иметь функцию в качестве параметра в конструкторе. Но я забыл : в объявлении метода message_handler в классе WebsocketClient.
Компилятор продолжал выдавать мне эту ошибку:
ошибка: невозможно преобразовать 'std::string' {он же 'std::__cxx11::basic_string<char>'} в 'int'.
Я был так сбит с толку, но наконец нашел проблему. Но почему компилятор не сообщает мне, что он не может разрешить тип (что, я думаю, и было проблемой, потому что синтаксис был неправильным)?
Это основной код:
void ws_msg_handler(std::string &msg_recieved){
std::cout << "ws_msg_handler: " << msg_recieved << std::endl;
}
WebsocketClient wsClient("ws://my.secret.ip.adress:7777", ws_msg_handler);
Это класс:
class WebsocketClient {
private:
void message_handler(std:string &recieved_msg); // <- here is ":" missing
public:
char *uri;
WebsocketClient(char *uri, void (*message_handler)(std::string&)){
this->uri = uri;
this->message_handler = message_handler;
};
void ws_data_receive_handler(esp_websocket_event_data_t *data_recieved){
std::string msg_recieved(data_recieved->data_ptr);
this->message_handler(msg_recieved); // <- here it gives the error: "error: cannot convert 'std::string' {aka 'std::__cxx11::basic_string<char>'} to 'int'"
}
};
Я попробовал погуглить и в конце концов спросил
«в конце концов, спросив chatgpt...» Chatgpt не является хорошим источником для решения проблем программирования.
«иметь функцию в качестве параметра...» Мы не можем использовать функцию в качестве параметра в C++. В примере у вас есть указатель на функцию в качестве параметра.
Кажется, у вас опечатка. Измените std:string &recieved_msg на std::string &recieved_msg. Обратите внимание на :: в последнем, которого вам не хватало. Также this->message_handler(msg_recieved); работает здесь
Кроме того, this->message_handler = message_handler не имеет смысла, поскольку message_handler — это функция, и вы пытаетесь присвоить ее функции.
@user12002570 user12002570 Я не профессионал в программировании. Вы понимаете, что я имею в виду под функцией как параметром. И да, я знаю, что у меня была опечатка, но я ее исправил. мне просто было любопытно, почему компилятор действует таким образом.
@Флорис Ваша программа this->message_handler(msg_recieved)работает здесь . Я бы также порекомендовал хорошую книгу по C++
Компиляторы не всегда выдают правильную или наиболее полезную диагностику. Вы можете попробовать скомпилировать свою программу в разностных компиляторах, чтобы иногда получать более полезную ошибку.





почему компилятор не сообщает мне, что не может разрешить тип?
Он сказал вам как первую ошибку, я получил:
<source>:10:26: error: 'std' is not a type
10 | void message_handler(std:string &recieved_msg); // <- here is ":" missing
| ^~~
<source>:10:29: error: expected ',' or '...' before ':' token
10 | void message_handler(std:string &recieved_msg); // <- here is ":" missing
| ^
<source>: In member function 'void WebsocketClient::ws_data_receive_handler(esp_websocket_event_data_t*)':
<source>:15:31: error: cannot convert 'std::string' {aka 'std::__cxx11::basic_string<char>'} to 'int'
15 | this->message_handler(msg_recieved); // <- here it gives the error: "error: cannot convert 'std::string' {aka 'std::__cxx11::basic_string<char>'} to 'int'"
| ^~~~~~~~~~~~
| |
| std::string {aka std::__cxx11::basic_string<char>}
<source>:10:26: note: initializing argument 1 of 'void WebsocketClient::message_handler(int)'
10 | void message_handler(std:string &recieved_msg); // <- here is ":" missing
| ^~~
Чтобы позволить диагностировать несколько ошибок, компилятор должен «восстановиться» от предыдущих ошибок. Замена неизвестных/неверно сформированных типов на int/void может быть методом. Однако это может привести к тому, что будущие ошибки будут сообщаться «неправильно».
Поэтому для получения точного отчета вам необходимо проверить первую ошибку.
Спасибо, странно, у меня только одна ошибка...
@Флорис, какой компилятор ты используешь? Я предполагаю, что вы используете какую-то IDE, которая фильтрует сообщения, всегда смотрите непосредственно на выходные данные компилятора, список сообщений IDE - это просто сводка.
@AlanBirtles Я использую esp-idf v5.2.1 для создания файлов. Я попробовал поискать в Google компилятор, который он использует, и думаю, что это xtensa-esp-elf v13.2.0(_20230928) для 32-битных чипов Xtensa (я использую ESP32-S3).
Приведите минимально воспроизводимый пример. Добавьте соответствующие
#includeи т. д.