我有他关注界面:
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 strange behavior
提前感谢您的帮助!
托马斯
答案 0 :(得分:1)
问题是你绑定了所有的参数,但是boost::function
以及你如何使用它的typedef表明它需要1个参数。
将其更改为以下内容。
slaveTaskCompletionFunction=boost::bind(&AbstractTask<T>::Join,&bindedTask,_1);
编辑:此外,当您通过引用传入bindedTask时,您遇到了切片问题。您必须通过指针传递它,或使用boost::ref
;否则,boost::bind
会尝试制作AbstractTask<T>
的副本,并且最终只会复制界面。
答案 1 :(得分:0)
尝试像这样绑定:
slaveTaskCompletionFunction=boost::bind(&AbstractTask<T>::Join, &bindedTask, _1);
答案 2 :(得分:0)
传递bindedTask pas const ref:
BindTaskCompleted(const AbstractTask<T> &bindedTask)
或使用boost :: ref绑定它:
boost::bind(&AbstractTask<T>::Join,boost::ref(bindedTask),result);