2009-02-13 2 views
2

Я хотел использовать повышение :: нить в моей программе, но получить следующее сообщение об ошибке компилятора (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 от this site.

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

#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; 
} 

ответ

7

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

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

большое спасибо! Теперь он работает с вашим решением. /mspoerr – mspoerr

+0

Рад помочь. Ссылки на функции членов и привязка всегда были пятном, которое меня тоже путало. –

0

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

4

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

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

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

Смежные вопросы