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は仮想メソッドでは使用できないと思っていましたが、そうではないようです: 仮想関数とブーストバインドの奇妙な動作

よろしくお願いします!

トーマス

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 pas const refを渡すか:

   BindTaskCompleted(const AbstractTask<T> &bindedTask) 

または、boost :: refを使用してバインドします:

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