【发布时间】:2011-08-05 21:30:01
【问题描述】:
我有以下类结构,其中有一个从模板继承的中间类:
#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 );
}
目的是让 Worker 的 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 的定义中放置 typename 来提供一些简单的提示,但没有任何问题可以解决这个问题。
最后,我希望第三个类能够拥有 1 到多个看起来像派生类实例的对象,每个对象都在 Worker 中获得回调。我希望模板成为 Derived 的基类,以便对象可以 ctor/dtor 并构造其回调。
我对 callback_t 的定义是否遗漏了什么?
***编辑更新:
上面的代码现在可以编译了;非常感谢您的建议。
即使上面的代码已经完全删除了 asio,我也添加了 boost::asio 标签。模板/类将建模一个 asio timer-wrapper,可以隐藏和管理自己的属性。我的协议完成处理程序(可以有多个状态计时器)将更易于阅读,并且计时器代码相同但迄今为止复制/粘贴的地方将重构为公共类并被继承。
【问题讨论】:
标签: c++ boost boost-asio