用于MBED的正确模板构造函数回调成员函数

时间:2016-12-11 07:26:46

标签: templates g++ member-function-pointers incomplete-type mbed

我正在使用mbed库,并希望将成员函数附加到Ticker(定期调用回调函数),这也是一个成员。我可能有我的类的多个实例,我希望每个实例能够管理自己的Ticker并允许回调函数处理其各自的数据。

代码:

* header */
class MyClass {
    uint16_t time;
    Ticker ticker;
    void Init();
    void SendMessage();
};

/* source */
void MyClass:: SendMessage() {
}

void MyClass::Init() {
    ticker.attach(Callback<MyClass>(this, &MyClass::SendMessage), time);
}

这给了我invalid use of incomplete type 'class mbed::Callback<MyClass>'

为什么MyClass需要完成成员函数指针的包装器?我是否遗漏了一些基本的东西,或者过于依赖Callback类的实现?

Callback class

Ticker class

1 个答案:

答案 0 :(得分:2)

这不是MyClass不完整。这是Callback<MyClass>不完整。

主要Callback模板故意不完整。范围内唯一的专业是

template <typename R>
class Callback<R()>

这意味着你需要传递一个函数类型,并且该函数必须没有参数。这称为类型擦除。可以从许多不同的类函数值构造回调,但结果类型始终为Callback <some-plain-function-type>。它与std::function非常相似,除了std::function允许任意函数签名。

由于你的回调返回void,你需要这样的东西:

ticker.attach(Callback<void()>(this, &MyClass::SendMessage), time);