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