使用C++11的线程库写程序的时候,使用类的成员函数作为线程函数,类成员函数形式大概如下:
class A {
public:
void foo()
{
cout << "foo!\n" ;
省略其他代码。。。
};
void start ();
};
在start()函数中想使用foo()函数作为线程函数,使用以下代码开启线程:
void start ()
{
thread t(&A::foo);
省略其他代码。。。
}
编译时报错为:
/usr/include/c++/4.8.2/functional: In instantiation of ‘struct std::_Bind_simple<std::_Mem_fn<void (slp::utils::config::*)()>()>’:
/usr/include/c++/4.8.2/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (slp::utils::config::*)(); _Args = {}]’
/usr/include/c++/4.8.2/functional:1697:61: 错误:no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (slp::utils::config::*)()>()>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8.2/functional:1727:9: 错误:no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (slp::utils::config::*)()>()>’
_M_invoke(_Index_tuple<_Indices...>)
原因时函数为成员函数,有隐藏的this指针为参数,所以需要显示传入,修改为如下即可:
void start ()
{
thread t(&A::foo,this);
省略其他代码。。。