2012-05-17 3 views
2

je lui interface suivante:boost :: bind et fonctions virtuelles

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

Et le implentation suivant:

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; 

}; 

J'essaie de lier le virtuel méthode join d'une mise en œuvre à AbstractTask une fonction boost :: avec la même signature. boost :: bind jette 77 erreurs de compilation et je ne vois pas pourquoi.

Je pensais au début que boost :: bind ne peut pas être utilisé avec la méthode virtuelle, mais cela ne semble pas être le cas: Virtual function and boost bind strange behavior

Merci d'avance pour votre aide!

Thomas

+0

Quels sont les erreurs de compilation? – Ylisar

Répondre

1

Le problème est que vous avez lié tous les arguments, mais le boost::function et comment vous l'utilisez typedef indique qu'il veut 1 argument.

Modifiez-le comme suit.

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

Edit: En outre, vous avez eu un problème de découpage en tranches lorsque vous avez passé à bindedTask par référence. Vous devez soit le transmettre par pointeur, soit utiliser boost::ref; sinon, boost::bind tente de faire une copie du AbstractTask<T> et finira par copier uniquement l'interface.

+0

Merci. Compilez et courez bien maintenant. – user1326256

0

Essayez de lier comme ceci:

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

Soit passer bindedTask pas const ref:

BindTaskCompleted(const AbstractTask<T> &bindedTask) 

ou utiliser boost :: ref pour le lier:

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