Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
test00110
0 / 0 / 0
Регистрация: 18.10.2016
Сообщений: 2
1

Ошибка cannot convert from type void*(classname::) () to type void*(*)(void*)

06.07.2018, 17:05. Просмотров 741. Ответов 2

Подскажите пожалуйста как избавиться от ошибки? Есть ещё какой-либо способ, кроме как объявить thread_func как static? Можно конечно определить функицю thread_func за пределами класса и передать указатель на thread_func в any_func, но этот вариант плох, поскольку придётся сделать переменные в class1 открытыми...

error: cannot convert ‘class1::thread_func’ from type ‘void* (class1:: ) (void*)’ to type ‘void* (*)(void*)’

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
#include <pthread.h>
#include <iostream>
using namespace std;
class class1
{
public:
    class1() {}
    void *thread_func(void *);
    void any_func();
private:
    int a, b, c;
};
void *class1::thread_func(void *var)
{
    // поточная функция должна иметь доступ к переменным-членам class1
    c = a + b;
    cout << var;
}
void class1::any_func()
{
    pthread_t tid;
    int var;
    pthread_create(&tid, NULL, thread_func, (void *)var);
}
int main()
{
    class1 obj;
    obj.any_func();
}
Добавлено через 1 час 9 минут
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2018, 17:05
Ответы с готовыми решениями:

Разыменование, QSort, const void в Type*
в общем виде class type; //////////////////// type **a;...

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это...

Дважды вычислить значение выражения, используя функции возвращающие void и не void
Хай!Помогите решить Дважды вычислить значение выражения, используя ...

Ошибка Cannot convert std::string to void*
Не могу сконвертировать строку в void*: std::string str; (void*)str; ...

Typedef void (WINAPI *GLEND)(void), как вызывать?
импортирую метод GLEND glmethod = (GLEND) GetProcAddress(hModule, &quot;glEnd&quot;); ...

2
ablex
10 / 10 / 6
Регистрация: 11.06.2018
Сообщений: 14
06.07.2018, 19:40 2
Лучший ответ Сообщение было отмечено test00110 как решение

Решение

test00110, для передачи this традиционно используется void * указатель.
Реализация выглядит так:
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
43
44
class class1
{
public:
    class1() : a(3), b(1), c() 
    {}
   
    void any_func();
    
private:
    static void * thread_func(void *);
    
    void thread_func();
    
    int a, b, c;
};
 
void * class1::thread_func(void * var)
{
    static_cast<class1*>(var)->thread_func(); // функция знает истинный тип и делает каст
    return NULL;
}
 
void class1::thread_func()
{
    // поточная функция должна иметь доступ к переменным-членам class1
    c = a + b;
}
 
void class1::any_func()
{
    pthread_t tid;
 
    pthread_create(&tid, NULL, thread_func, this); // здесь передаем указатель на экземпляр
    
    pthread_join(tid, NULL);
    
    std::cout << c << std::endl;
}
 
int main()
{
    class1 obj;
    obj.any_func();
}
Любые существующие обертки, будет то std::\boost::thread или QThread так или иначе используют этот прием.
1
test00110
0 / 0 / 0
Регистрация: 18.10.2016
Сообщений: 2
06.07.2018, 19:46  [ТС] 3
Спасибо! Всё работает
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2018, 19:46

Что значит void(*f)()=(void(*)()func?
void(*f)()=(void(*)())func; Объясните, пожалуйста, что значит этот код.

delete или new (typeid(void*))(void*)
Доброе время суток. Пишу список. Телом каждого элемента (el) списка является...

Error C2084: функция "void mehanizm:print(void)" уже имеет текст реализации
Добрый день, я столкнулся с проблемой вывода элемента на экран, выбивает:...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru