boost:thread — ошибка компилятора

Я хотел использовать boost::thread в своей программе, но получил следующую ошибку компилятора (Visual Studio 2005):

Error   1   **error C2064**: term does not evaluate to a function taking 0
arguments   d:\...\boost_1_37_0\boost\thread\detail\thread.hpp  56

Поэтому я попытался воссоздать проблему в небольшой программе и изменил рабочий пример Hello World из этого сайт.

Мой тестовый код теперь выглядит так. Почему это не работает внутри класса?:

#include <boost/thread.hpp>
#include <iostream>


class HelloWorld
{
public:
    void hello();
    void entry();
};

void HelloWorld::entry()
{
    boost::thread thrd(&HelloWorld::hello);
    thrd.join();
}

void HelloWorld::hello() 
{ 
    std::cout << "Hello world, I'm a thread!" << std::endl;
}

int main(int argc, char* argv[]) 
{ 
    HelloWorld *bla = new HelloWorld;
    bla->entry();
    return 0;
}

person mspoerr    schedule 13.02.2009    source источник


Ответы (3)


Попробуйте так: конструктор boost::thread ожидает boost::function0 (который является указателем функции, но не указателем функции-члена из-за указателя this).

void HelloWorld::entry()
{
    boost::thread thrd(boost::bind(&HelloWorld::hello,this));
    thrd.join();
}
person Harper Shelby    schedule 13.02.2009
comment
большое спасибо! Теперь он работает с вашим решением. /mspoerr - person mspoerr; 13.02.2009
comment
Рад помочь. Ссылки на функции-члены и связывание всегда были местом, которое меня смущало. - person Harper Shelby; 13.02.2009

Функции-члены имеют указатель this в качестве первого аргумента. Поскольку существует конструктор boost::thread, который принимает аргументы функции, вам не нужно использовать boost::bind. Это также будет работать:

void HelloWorld::entry()
{
    boost::thread thrd(&HelloWorld::hello,this);
    thrd.join();
}

Если вашей функции требуются аргументы, вы можете поместить их после аргумента указателя this.

person Community    schedule 17.04.2009

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

person mch    schedule 13.02.2009