Я начинающий программист на C ++ и программирую на Linux-машине.
Я получил эту ошибку:
cannot convert ‘void* (Network::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
Это исходит из этой строки:
pthread_create(&thread_id,0,&Network::SocketHandler, (void*)csock );
Функция, которую я пытаюсь вызвать:
void* Network::SocketHandler(void* lp)
Я объявил обе функции в заголовочном файле как частные.
Кто-нибудь из вас видит, что я делаю не так?
Вы используете указатель на функцию-член где обычный указатель на функцию ожидается. функция-член имеет неявный дополнительный параметр: this
, pthread_create
не учитывает это.
Вам придется сделать функцию static
чтобы иметь возможность использовать его с pthread_create
, Затем вы можете использовать void*
параметр для передачи того, что в противном случае было бы this
указатель.
Лично я бы просто угробил Pthreads в пользу C ++ 11 std::thread
, или же boost::thread
если у вас нет доступа к C ++ 11 реализация.
РЕДАКТИРОВАТЬ: Если вы не пытаетесь использовать экземпляр Network
с функцией, то ответ K-балла это то, что вам нужно. Если да, то читайте дальше.
pthread_create
ожидает нормальную функцию для вызова, и вы пытаетесь использовать функцию-член в качестве функции, не являющейся членом. Функция-член не является нормальной функцией, потому что она должна иметь вызывающий объект.
Вы можете сделать функцию, которая вызывает Network::SocketHandler
на Network
и сделай так:
void* call_sockethandler(void* nw) {
Network* network = static_cast<Network*>(nw);
void* result = network->SocketHandler(somearg);
// do something w/ result
return nullptr;
}
Network nw; // this can't go out of scope though
pthread_create(&thread_id, 0, call_sockethandler, &nw);