2

我有他以下界面:

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奇怪的行为

在此先感谢您的帮助!

托马斯

4

3 回答 3

1

问题是您已经绑定了所有参数,但是boost::functiontypedef 以及您使用它的方式表明它需要 1 个参数。

将其更改为以下内容。

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

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

于 2012-05-17T12:02:40.320 回答
0

尝试像这样绑定:

slaveTaskCompletionFunction=boost::bind(&AbstractTask<T>::Join, &bindedTask, _1);
于 2012-05-17T12:03:03.500 回答
0

要么通过 bindedTask 传递 const ref:

   BindTaskCompleted(const AbstractTask<T> &bindedTask) 

或使用 boost::ref 绑定它:

   boost::bind(&AbstractTask<T>::Join,boost::ref(bindedTask),result);
于 2012-05-17T12:07:15.210 回答