1

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

代码:

* 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

回答

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); 
+0

编译和测试。并澄清问题标题,因为它实际上不是一个不完整的类型问题。 – ptpaterson