2014-11-14 74 views
1

我与升压::线程库起点,也我有这样的代码:的boost ::线程无效使用了非静态成员函数的

Class::Class() 
{ 
    ... 
    boost::thread thread_foo(Class::foo); 
    ... 
} 

Class::foo() 
{ 
    //do stuff 
} 

但是,当我编译它,我有一个“非法使用非静态成员函数”,我真的不知道什么是错误的,因为当我查看文档时,这是创建线程的方式。

我敢肯定这是一个愚蠢的错误,但我只是没有看到它。

谢谢

回答

4

你也应该发送对象。

boost::thread thread_foo(&Class::foo, this); 

boost::thread thread_foo(boost::bind(&Class::foo, this)); 
+1

或者'[this] {foo();}',如果您发现指向成员的语法丑陋。 – 2014-11-14 14:45:54

3

所有非静态成员函数有一个隐藏的第一个参数,那就是在成员函数this指针。

如果您未提供调用成员函数的实例,那么this将不确定,您将有undefined behavior

另一方面,Statis成员函数没有这个隐藏参数,因此可以在没有实例的情况下调用。

要解决您的问题,请听取编译器消息并使您的成员函数静态。或者您将参数传递给线程函数,并且该参数必须是调用该函数的实例(通常为this)。

+1

我真的很喜欢这个解释,我自己也在学习,所以当有人分享他的知识时它很酷:) – Kruncho 2014-11-14 16:16:37