2011-08-03 62 views
0

我有下面的类结构与从模板继承的中间阶段:的boost ::功能模板基类错误

#include <boost/function.hpp> 
#include <boost/bind.hpp> 

template<class T> 
struct Base { 
    typedef 
     boost::function<void (T*,int)> 
    callback_t; 

    callback_t m_callback; 

    Base(callback_t cb): 
     m_callback(cb) 
    {} 
    virtual ~Base() 
    {} 

    void handleError(int error_code) { 
     m_callback(this,error_code); 
    } 
}; 

struct Derived: public Base<Derived> { 
    Derived(Base<Derived>::callback_t cb): 
     Base<Derived>(cb) 
    {} 
    ~Derived() 
    {} 
}; 

struct Worker { 
    Derived m_o; 

    void myErrorHandler(Derived* o,int error_code) 
    {} 

    Worker(void): 
     m_o(boost::bind(&Worker::myErrorHandler,this,_1,_2)) 
    {} 
}; 

int main(int argc,const char** argv) 
{ 
    Worker m; 
    return(0); 
} 

的目的是使工人myErrorHandler()接受生成回调以及任意整数值的对象。说实话,这是一个asio回调处理程序的简化版本,但为了简洁起见,我拿出了asio。

编译器抱怨有*的typedef ... callback_t *模板,里面说:

../src/templates.cpp:13: error: a call to a constructor cannot appear in a constant-expression 
../src/templates.cpp:13: error: template argument 1 is invalid 

我已经通过放置类型名称在这个定义callback_t的尝试琐碎的线索,但没有得到过去的这个问题。

最后,我希望第三类能够拥有1到多个看起来像派生类实例的对象,每个对象都在Worker中获得它们的回调。我希望模板是派生的基类,因此对象可以构造/构造它的回调。

我在我的callback_t的定义中缺少一些东西吗?

***编辑更新:

上述代码现在将编译;非常感谢您的建议。

即使上述代码已将asio完全删除,我也添加了boost :: asio标记。模板/类将建立一个可以隐藏和管理自己属性的asio计时器包装器。我的协议完成处理程序(可以有多个状态计时器)会更简单一些,而且定时器代码相同,但迄今为止复制/粘贴的地方会重构为常用类并被继承。

回答

0

这里您不需要typenameT被称为是一种类型。此外,您不能使用参数名称作为function参数的一部分。所以它应该只是boost::function<void(T*, int)>

而你可能确实需要typenameDerived(Base<Derived>::callback_t cb)

+0

感谢您的信息。我已经提出了编辑建议,并添加了我自己的一个,现在编译。非常感谢! –

0

首先 - 正如其他猫已经提到的 - 第7行中的typename是错误的。但是,在这些情况下,参数的名称可以作为函数参数给出,因此error_code可以停留在那里。没有其他typenames是必要的。

第二,绑定非静态成员函数指针的boost::bind的第二个参数必须是指向该函数将被调用的对象的指针。使用this作为第二个参数在这里会有所帮助,但从逻辑的角度来看,这是否是有意的还不完全清楚。

+0

感谢您的信息。我做了编辑,并添加了我自己的一个,然后编译。 –

+0

@zap如果此答案为您解决了问题,请点击旁边的复选标记以接受答案。 –