boost :: bind函数及其输入参数错误

时间:2011-09-24 18:06:45

标签: c++ boost bind boost-thread

我正试图通过boost::bind进行多线程处理。但是,我收到了错误:

  

src / model.cpp:225:从这里实例化   /boost_1_45_0v/include/boost/bind/mem_fn.hpp:333:错误:指向成员类型void (Model::)(taskDataSPType&)的指针与对象类型taskDataSPT1ype不兼容
  make: * [model.o]错误1

这是我的代码:

void Model::runTask(taskDataSPType& myTask)
{}

taskDataSPType myTask;

fifo_pool tp(thread_num);

for (int i = 0 ; i < totalTaskNum ; +i)
{
    taskQueue.wait_and_pop(myTask, i);
    myTask.taskID = i ;
    // run the typical iterations 
    tp.schedule(boost::bind(&Model::runTask, &myTask));
}
tp.wait();

在另一个头文件中,我有:

typedef struct taskDataSPT1ype taskDataSPType;

struct taskDataSPT1ype
{
    int taskID;
    int startNode;
    int endNode;
};

2 个答案:

答案 0 :(得分:2)

Model::runTask(推测)是非静态成员函数。这意味着你不能在没有类的实例的情况下调用它。 boost::bind知道这一点,因此它期望第一个参数是某种形式的Model或其派生类。因此,您的bind有两个参数:Model和函数参数taskDataSPType&

此外,您的参数是一个引用,但您似乎附加了一个指针。那也不行。您可能需要使用boost::ref,如下所示:

tp.schedule(boost::bind(&Model::runTask, /*Some Model Instance*/,
    boost::ref(myTask)));

答案 1 :(得分:0)

&Model::runTask是一个成员函数,因此它有一个额外的隐式参数this。因此,在您的特定情况下,您希望将其与两个参数绑定:ModeltaskDataSPType对象的实例。请注意,如果想要传递bind引用,则必须使用boost::refboost::cref