boost: thread - ошибка компилятора - PullRequest
2 голосов
/ 13 февраля 2009

Я хотел использовать 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;
}

Ответы [ 3 ]

7 голосов
/ 13 февраля 2009

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

void HelloWorld::entry()
{
    boost::thread thrd(boost::bind(&HelloWorld::hello,this));
    thrd.join();
}
4 голосов
/ 17 апреля 2009

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

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

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

0 голосов
/ 13 февраля 2009

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

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