boost :: bind和虚函数

时间:2012-05-17 11:45:14

标签: c++ boost

我有他关注界面:

template <class T>
class AbstractTask {
public:
    virtual void BindTaskCompleted(AbstractTask<T> &bindedTask)=0;
    virtual void Join(TaskResult<T>)=0;
};

以下实施:

template <class T>
class SlaveTask: public AbstractTask<T> {
public:
    typedef boost::function<void(TaskResult<T>)> joinFunction;

    void BindTaskCompleted(AbstractTask<T> &bindedTask)
    {
        /////////////WORK OK//////////////////////////////  
        //bindedTask.Join(result);

        /////////////COMPILATION ERROR/////////////////////
        slaveTaskCompletionFunction=boost::bind(&AbstractTask<T>::Join,bindedTask,result);
    }

     void Join(TaskResult<T> r)
    {
        slaveTaskCompletionFunction(r);
    }

private:
    joinFunction slaveTaskCompletionFunction;
    TaskResult<T> result;

};

我正在尝试将AbstractTask实现的虚拟Join方法绑定到具有相同签名的boost :: function。 boost :: bind抛出了77个编译错误,我看不出原因。

我起初认为boost :: bind不能用于虚方法,但似乎并非如此: Virtual function and boost bind strange behavior

提前感谢您的帮助!

托马斯

3 个答案:

答案 0 :(得分:1)

问题是你绑定了所有的参数,但是boost::function以及你如何使用它的typedef表明它需要1个参数。

将其更改为以下内容。

slaveTaskCompletionFunction=boost::bind(&AbstractTask<T>::Join,&bindedTask,_1);

编辑:此外,当您通过引用传入bindedTask时,您遇到了切片问题。您必须通过指针传递它,或使用boost::ref;否则,boost::bind会尝试制作AbstractTask<T>的副本,并且最终只会复制界面。

答案 1 :(得分:0)

尝试像这样绑定:

slaveTaskCompletionFunction=boost::bind(&AbstractTask<T>::Join, &bindedTask, _1);

答案 2 :(得分:0)

传递bindedTask pas const ref:

   BindTaskCompleted(const AbstractTask<T> &bindedTask) 

或使用boost :: ref绑定它:

   boost::bind(&AbstractTask<T>::Join,boost::ref(bindedTask),result);