【问题标题】:boost::function in template baseclass error模板基类错误中的 boost::function
【发布时间】: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 );
}

目的是让 WorkermyErrorHandler() 接受生成回调的对象以及任意整数值。说实话,这是一个简化版的 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


    【解决方案1】:

    这里不需要typenameT 已知是一种类型。此外,您不能将参数名称用作 function 参数的一部分。所以应该是boost::function&lt;void(T*, int)&gt;

    你可能确实需要typename in Derived(Base&lt;Derived&gt;::callback_t cb)

    【讨论】:

    • 感谢您的信息。我已经进行了建议的编辑,添加了我自己的一个,现在可以编译了。非常感谢!
    【解决方案2】:

    首先——正如 cat else 已经提到的——第 7 行中的 typename 是错误的。但是,在这些上下文中,参数的名称可以作为函数参数给出,因此error_code 可以保留在那里。不再需要typenames

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

    【讨论】:

    • 感谢您的信息。我已经进行了编辑,并添加了我自己的一个,它可以编译。
    • @zap 如果此答案为您解决了问题,请单击它旁边的复选标记以接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多