0

我试图运行 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);
}

在主要:

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

这段代码有什么问题?

4

1 回答 1

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,以便我们评估真正的问题是什么。

于 2013-04-08T13:11:10.227 回答