не может конвертировать «void * (Network :: *) (void *)» в «void * (*) (void *)»

Я начинающий программист на 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)

Я объявил обе функции в заголовочном файле как частные.

Кто-нибудь из вас видит, что я делаю не так?

4

Решение

Вы используете указатель на функцию-член где обычный указатель на функцию ожидается. функция-член имеет неявный дополнительный параметр: this, pthread_create не учитывает это.

Вам придется сделать функцию static чтобы иметь возможность использовать его с pthread_create, Затем вы можете использовать void* параметр для передачи того, что в противном случае было бы this указатель.

Лично я бы просто угробил Pthreads в пользу C ++ 11 std::thread, или же boost::thread если у вас нет доступа к C ++ 11 реализация.

6

Другие решения

РЕДАКТИРОВАТЬ: Если вы не пытаетесь использовать экземпляр 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);
2

По вопросам рекламы [email protected]