boost::线程编译错误

boost::thread compilation error

本文关键字:错误 编译 线程 boost      更新时间:2023-10-16

我正在尝试使用boost::thread运行以下程序。

#include <boost/thread.hpp>
#include <iostream>
using namespace std;
class test{
public:
  void hello(int i)
  {
     cout << i << " ";
  };
};
int main(int argc, char* argv[])
{
  class test t;
  boost::thread thrd(t.hello, 10);
  thrd.join();
  return 0;
}

它在编译时抛出了一个错误,如下所示:

thread.c:17:33:错误:没有用于调用的匹配函数'boost::thread::thread(,int)'/usr/include/boost/thread/detail/thread.hpp:236:9:注意:候选者分别为:boost::thread::thread(F,A1)[其中F=void(test::*)(int),A1=int]/usr/include/boost/thread/detail/thread.hpp:202:9:注意:
boost::thread::thread(boost::detail::thread_move_t)

我使用的是助推1.42。我也尝试过老式的boost::线程创建。

当hello()不是类函数时,一切都很好。请告诉我该怎么修?

您没有阅读文档。

您要么需要使hello方法函数为静态的,要么通过将类型测试的对象传递给它的构造函数来创建线程:

int main(int argc, char* argv[])
{
  test t;
  boost::thread thrd(&test::hello, &t, 10);
  thrd2.join();
}

问题是你试图绑定到一个成员函数,请尝试以下操作(我没有你的boost版本,所以不知道这是否有效)

boost::thread thrd(&test::hello, &t, 10);

如果失败,您可以使用活页夹

boost::thread thrd(
    boost::bind(&test::hello, &t, 10));

如果你的编译器足够新,你可以通过更改std::的boost命名空间来使用所有这些的标准库等价物(占位符在std::占位符中,而不是全局命名空间)。

std::thread(... //c++11

尝试使用以下代码:

int main(int argc, char* argv[])
{
  test t;
  boost::thread thrd(&test::hello,&t,10);
  thrd.join();
  return 0;
}