我正试图通过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;
};
答案 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
。因此,在您的特定情况下,您希望将其与两个参数绑定:Model
和taskDataSPType
对象的实例。请注意,如果想要传递bind
引用,则必须使用boost::ref
或boost::cref
。