2012-05-17 34 views
2

我有他如下界面:的boost ::绑定和虚拟功能

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

而下面implentation:

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实施的方法具有相同签名的boost :: function。 boost :: bind抛出77个编译错误,我看不出为什么。

我原先以为的boost ::绑定无法与虚拟的方法来使用,但这似乎并没有这样的情况: Virtual function and boost bind strange behavior

预先感谢您的帮助!

托马斯

+0

什么编译错误? – Ylisar

回答

1

问题是你已经绑定的所有的参数,但boost::function,你是如何使用它的typedef表示,它希望1个说法。

将其更改为以下内容。

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

编辑:另外,当您在bindedTask通过引用了切割问题。您必须通过指针传递它,或者使用boost::ref;否则,boost::bind会尝试复制AbstractTask<T>,并且最终只会复制该接口。

+0

谢谢。现在编译并运行。 – user1326256

0

尝试绑定这样的:

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

要么通过bindedTask PAS常量参考:

BindTaskCompleted(const AbstractTask<T> &bindedTask) 

或使用boost ::裁判将其绑定:

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