2009-02-13 136 views
2

我想使用boost ::线程在我的计划,但得到以下编译器错误(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 

所以我试图重新创建一个小问题程序并修改了从this site开始工作的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; 
} 

回答

7

尝试像这样 - boost :: thread构造函数期待boost :: function0(函数指针是,但是由于这个指针而不是成员函数指针)。

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

非常感谢你!它现在适用于您的解决方案。 /mspoerr – mspoerr 2009-02-13 15:48:01

0

内部工作你传递一个成员函数的线程对象的功能,当线程启动时调用。由于线程本身没有对象,因此无法调用成员函数。你可以使hello函数为静态,或者查看boost :: bind库来发送对象。

4

成员函数具有指针作为第一个参数。由于有一个boost :: thread构造函数接受函数参数,所以不需要使用boost :: bind。这也将工作:

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

如果你的函数需要的参数,你可以把他们的指针参数后。