我正在使用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
类的实现?
答案 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);