如何使用boost来运行带回调的另一个对象函数

时间:2013-04-08 12:59:28

标签: c++ boost asynchronous

我试图使用回调

运行boost :: thread一些对象函数 在A类中,有一个像这样的函数:

void DoWork(int (*callback)(float))   
{
float variable = 0.0f;

 boost::this_thread::sleep(boost::posix_time::seconds(1));
int result = f(variable);
}
MAIN中的

int SomeCallback(float variable)
{
  int result;
  cout<<"Callback called"<<endl;
  //Interpret variable

  return result;
}



int main(){
  A* file = new A();

boost::thread bt(&A::DoWork, file , &SomeCallback );
cout<<"Asyns func called"<<endl;
bt.join();
cout<<"main done"<<endl; 
}

boost::thread bt(&A::DoWork, file , &SomeCallback );导致链接器错误。我从本教程中接到的这个电话: http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html

错误是:

unresolved external symbol "public: void __thiscall A::DoWork(int (__cdecl*)(float))" (?DoWork@A@@QAEXP6AHM@Z@Z) referenced in function _main

这段代码有什么问题?

1 个答案:

答案 0 :(得分:2)

未解析的外部符号是链接器错误,这意味着链接器无法找到A::DoWork的定义。从你的代码我看不到你实际定义函数的位置,但让我猜:

//A.h

class A {
  //...
public:
  void DoWork(int (*callback)(float)); //declaration
};

//A.cpp

void DoWork(int (*callback)(float))   
{
  float variable = 0.0f;

  boost::this_thread::sleep(boost::posix_time::seconds(1));
  int result = f(variable);
}

即。 如果定义与您在.cpp文件中发布的完全相同,那么错误是您没有定义A::DoWork,而是定义了一个新的免费函数。

然后正确的定义是:

//A.cpp

void A::DoWork(int (*callback)(float))   //define it as a member of A!
{
  float variable = 0.0f;

  boost::this_thread::sleep(boost::posix_time::seconds(1));
  int result = f(variable);
}

如果我猜错了,请提供SSCCE,以便我们评估真正的问题。