Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 10.12.2021
Сообщений: 60

Ошибка компиляции: несовместимые типы при передаче метода класса

17.07.2024, 20:49. Показов 2629. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
приветствую! Я столкнулся с проблемой несовместимости типов.
У меня есть следующий класс:
C++
1
2
3
4
5
6
7
class Example 
{ 
     Example(){} 
private: 
     void test_callback(int a, const char *b);
     void function();
};
Мне нужно передать в качестве аргумента функцию Example::executable как callback следующей функции add_callback:
C++
1
2
3
typedef void callback(int a, 
const char b[1024]); 
void add_callback(callback a);
Я делаю это следующим способом:
C++
1
2
3
4
Example::Example(){function()}; 
void Example::function(){ 
   add_callback(Example::test_callback);//тут ошибка 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2024, 20:49
Ответы с готовыми решениями:

Ошибка при передаче результата метода класса
Добрый день Есть сервер: using System; using System.Runtime.Serialization; using System.Collections.Generic; using...

Ошибка несовместимые типы
Доброго времени суток форумчане проблема такого плана в этом куске текста пишет ошибку несовместимые типы конкретно Append(f) private ...

Ошибка E2008 (Несовместимые типы)
Ошибка в первом аргументе функции: Pos(wordstart + ' ', wordsNear + ' ') Функция принимает RawByteString, а wordstart : array of...

5
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.07.2024, 21:12
Цитата Сообщение от s1and1s Посмотреть сообщение
//тут ошибка
Ну давай на секунду представим, что это сработало бы. Как бы этот колбэк вызывался (для какого объекта)?
0
1 / 1 / 0
Регистрация: 10.12.2021
Сообщений: 60
17.07.2024, 21:21  [ТС]
да, согласен, в этом и заключается вся суть данной проблемы.

Добавлено через 2 минуты
А вот как бы вы поступили бы в данной ситуации?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.07.2024, 21:40
Лучший ответ Сообщение было отмечено s1and1s как решение

Решение

Цитата Сообщение от s1and1s Посмотреть сообщение
А вот как бы вы поступили бы в данной ситуации?
Суть в том, что методы вызываются относительно объекта. Функция-член отличается от обычной функции(у неё есть "скрытый" параметр) и они не совместимы.
Поэтому ссылку(указатель) на объект нужно как-то передать тому, кто будет вызывать метод. И дело в том, что интерфейс передачи колбэка(даже если он "сишный", как у тебя) должен поддерживать такой механизм. Этот интерфейс тогда выглядел бы например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
typedef void (*callback)(int a, const char b[1024], void *user_pointer); 
void add_callback(callback a, void *user_pointer);
void call_callback();
 
struct Example 
{ 
     void test_callback(int a, const char *b) {
        std::cout << a << ' ' << b << '\n';
     }
 
     void function() {
        add_callback(&common_callback, this);
     }
    // статическая функция-член это обычная функция и она по типу совместима с callback
     static void common_callback(int a, const char *b, void *user_pointer) {
        static_cast<Example*>(user_pointer)->test_callback(a, b);
     }
};
 
int main() {
    Example e;
    e.function();
 
    call_callback();
}
 
// это просто внутреннее состояние для демонстрации
struct callback_private {
        callback cb;
        void *pointer;
    } state;
 
void add_callback(callback a, void *user_pointer) {
    state.cb = a;
    state.pointer = user_pointer;
}
 
void call_callback() {
    state.cb(42, "hello", state.pointer);
}
1
1 / 1 / 0
Регистрация: 10.12.2021
Сообщений: 60
17.07.2024, 21:49  [ТС]
простите, но функция add_callback уже прописана другим разработчиком и не может быть изменена
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.07.2024, 21:57
Цитата Сообщение от s1and1s Посмотреть сообщение
простите, но функция add_callback уже прописана другим разработчиком и не может быть изменена
Тогда единственный вариант - передавать обычную функцию, а не метод. А если нужен метод, то только сохранять указатель на объект на своей стороне, глобально, доступно для функции колбэка (и это будет уникальная пара функция/указатель для каждого объекта, если нужно зарегистрировать более чем один метод).

Но будет лучше, если вы покажете интерфейс, предоставленный другим разработчиком, как он есть. Возможно, вы просто упустили этот механизм из виду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2024, 21:57
Помогаю со студенческими работами здесь

Ошибка при передаче переменной из метода
Требуется помощь по лабораторной работе по C# Windows Forms Проблема в передаче (выводе) значения одной переменной 'x' из этого метода: ...

Ошибка компиляции при передаче указателя на объект в вектор
Реализированная на строках 32-39 функция записывающая даннные в вектор не работает и еще при компляции для строки 37 выводится ошибка: ...

Ошибка E2010 (Несовместимые типы: 'Char' и 'Pointer')
wordend := Pointer(wordstart + Length(root)); wordend - Char Понятно, что исправить можно заменив Pointer на Char. Просто не...

Типизированный View объектом Dictionary. Ошибка компиляции при передаче параметра в POST
Допустим, есть класс Teacher, собираюсь создать форму для смены пароля. В самом Teacher пароль в явном виде храниться не будет, он будет...

Ошибка при передаче класса в функцию
Есть класс WTExpressionBox.Внутри он инкапсулирует нативную структуру TExpressionBox.Вот грубый код, который набросал просто чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru