C++ boost::模板基类中的函数错误

C++ boost::模板基类中的函数错误,c++,boost,boost-asio,C++,Boost,Boost Asio,我有以下类结构,其中包含一个从模板继承的中间类: #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):

我有以下类结构,其中包含一个从模板继承的中间类:

#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 );
}
我尝试过在回调函数的定义中加入typename,这是一个很小的提示,但是没有什么能解决这个问题

最后,我希望第三个类能够有1到多个看起来像派生类实例的对象,每个对象都在Worker中得到回调。我希望模板是派生的基类,以便对象可以使用ctor/dtor并构造其回调

我对回调的定义是否遗漏了什么

***编辑更新:

上面的代码现在将编译;非常感谢你的建议


我添加了boost::asio标记,尽管上面的代码已经完全删除了asio。模板/类将对asio计时器包装器建模,该包装器可以隐藏和管理自己的属性。我的协议完成处理程序(可以有多个状态计时器)将更易于阅读,并且计时器代码相同但迄今为止复制/粘贴的地方将重构为公共类并被继承

这里不需要
typename
t
是已知的一种类型。此外,不能将参数名称用作
函数
参数的一部分。所以它应该是
boost::function

而且您可能确实需要
typename
Derived(Base::callback\t cb)
中,首先——正如cat else已经提到的那样——第7行中的
typename
是错误的。但是,在这些上下文中,参数的名称可以作为函数参数给出,因此
error\u code
可以保留在那里。不需要进一步的
类型名


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

谢谢您提供的信息。我已经做了编辑,并添加了我自己的一个,它已经编译了。@zap如果这个答案为您解决了问题,请单击它旁边的复选标记接受答案。谢谢您提供的信息。我已经做了建议的编辑,添加了我自己的一个,现在可以编译了。非常感谢!
../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