как вызвать функцию-член потока из main () - PullRequest
0 голосов
/ 07 июля 2011

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

В main.cpp:

int main() 
{
    WishList w;
    boost::thread thrd(&w.show_list);
    thrd.join();
}

В другом_филе.cpp:

class WishList{
public:
      void show_list();
}

void WishList::show_list(){
        .
        .
        .
        .
}

Я получаю следующую ошибку

error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say ‘&WishList::show_list’

/home/sharatds/Downloads/boost_1_46_1/boost/thread/detail/thread.hpp: In member function ‘void boost::detail::thread_data<F>::run() [with F = void (WishList::*)()]’:

/home/sharatds/Downloads/boost_1_46_1/boost/thread/detail/thread.hpp:61:17: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((boost::detail::thread_data<void (WishList::*)()>*)this)->boost::detail::thread_data<void (WishList::*)()>::f (...)’, e.g. ‘(... ->* ((boost::detail::thread_data<void (WishList::*)()>*)this)->boost::detail::thread_data<void (WishList::*)()>::f) (...)’

РЕДАКТИРОВАТЬ: Проблемы с установкой библиотеки Boost для потоков. Попробуем это, как только оно заработает

Ответы [ 2 ]

5 голосов
/ 07 июля 2011

Синтаксис для получения адреса функции-члена: &ClassName::FunctionName, поэтому он должен быть &WishList::show_list, но теперь вам нужен объект для вызова указателя функции. Лучшим (и самым простым) является использование boost::bind:

#include <boost/bind.hpp>

WishList w;
boost::thread t(boost::bind(&WishList::show_list, &w));
2 голосов
/ 07 июля 2011

Ничего общего с потоками, это просто "как получить указатель на функцию-член". Сделайте то, что говорит компилятор, скажем &WishList::show_list. Но вам также может понадобиться передать указатель экземпляра.

Обновление: Да, используйте bind, как говорит Xeo.

Относительно вашего заголовка: обратите внимание, что функция не «принадлежит потоку». Классы не являются частью потоков. Все потоки обращаются к одной и той же памяти - каждый поток имеет свое собственное пространство для автоматического хранения, но в определении класса нет ничего, что говорило бы: «это идет в отдельном потоке».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...