我有下面的类结构与从模板继承的中间阶段:的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计时器包装器。我的协议完成处理程序(可以有多个状态计时器)会更简单一些,而且定时器代码相同,但迄今为止复制/粘贴的地方会重构为常用类并被继承。
感谢您的信息。我已经提出了编辑建议,并添加了我自己的一个,现在编译。非常感谢! –