2012-05-17 33 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);