Почему компилятор С++ хочет преобразовать в int, если тип объявлен неправильно?

Я писал класс веб-сокета и хотел иметь функцию в качестве параметра в конструкторе. Но я забыл : в объявлении метода 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'"

    }

};

Я попробовал погуглить и в конце концов спросил

Приведите минимально воспроизводимый пример. Добавьте соответствующие #include и т. д.

user12002570 31.08.2024 15:18

«в конце концов, спросив chatgpt...» Chatgpt не является хорошим источником для решения проблем программирования.

user12002570 31.08.2024 15:19

«иметь функцию в качестве параметра...» Мы не можем использовать функцию в качестве параметра в C++. В примере у вас есть указатель на функцию в качестве параметра.

user12002570 31.08.2024 15:20

Кажется, у вас опечатка. Измените std:string &recieved_msg на std::string &recieved_msg. Обратите внимание на :: в последнем, которого вам не хватало. Также this->message_handler(msg_recieved); работает здесь

user12002570 31.08.2024 15:23

Кроме того, this->message_handler = message_handler не имеет смысла, поскольку message_handler — это функция, и вы пытаетесь присвоить ее функции.

user12002570 31.08.2024 15:24

@user12002570 user12002570 Я не профессионал в программировании. Вы понимаете, что я имею в виду под функцией как параметром. И да, я знаю, что у меня была опечатка, но я ее исправил. мне просто было любопытно, почему компилятор действует таким образом.

Floris 31.08.2024 15:25

@Флорис Ваша программа this->message_handler(msg_recieved)работает здесь . Я бы также порекомендовал хорошую книгу по C++

user12002570 31.08.2024 15:27

Компиляторы не всегда выдают правильную или наиболее полезную диагностику. Вы можете попробовать скомпилировать свою программу в разностных компиляторах, чтобы иногда получать более полезную ошибку.

user12002570 31.08.2024 16:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

почему компилятор не сообщает мне, что не может разрешить тип?

Он сказал вам как первую ошибку, я получил:

<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 может быть методом. Однако это может привести к тому, что будущие ошибки будут сообщаться «неправильно».

Поэтому для получения точного отчета вам необходимо проверить первую ошибку.

Спасибо, странно, у меня только одна ошибка...

Floris 31.08.2024 15:42

@Флорис, какой компилятор ты используешь? Я предполагаю, что вы используете какую-то IDE, которая фильтрует сообщения, всегда смотрите непосредственно на выходные данные компилятора, список сообщений IDE - это просто сводка.

Alan Birtles 31.08.2024 16:40

@AlanBirtles Я использую esp-idf v5.2.1 для создания файлов. Я попробовал поискать в Google компилятор, который он использует, и думаю, что это xtensa-esp-elf v13.2.0(_20230928) для 32-битных чипов Xtensa (я использую ESP32-S3).

Floris 31.08.2024 17:20

Другие вопросы по теме