1

J'utilise la bibliothèque mbed et je souhaite attacher une fonction membre à un Ticker (appelle une fonction de rappel à intervalle régulier) qui est également un membre. Je peux avoir plusieurs instances de ma classe et j'aimerais que chacune puisse gérer ses propres Ticker et permettre à la fonction de rappel de traiter ses données respectives.Constructeur de modèle correct pour MBED Rappel de la fonction membre

code:

* 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); 
} 

Cela me donne invalid use of incomplete type 'class mbed::Callback<MyClass>'

Pourquoi ne MyClass besoin d'être complet pour une enveloppe pour un pointeur de fonction membre? Ai-je manqué quelque chose de fondamental, ou est-il trop dépendant de l'implémentation de la classe Callback?

Callback class

Ticker class

Répondre

2

C'est pas MyClass incomplète. Il est environ Callback<MyClass> être incomplet.

Le modèle principal Callback est incomplet intentionnellement. La seule spécialisation portée est

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

qui signifie que vous devez passer un type de fonction, et la fonction ne doit pas avoir des arguments. Ceci est appelé type effacement. Un rappel peut être construit à partir de nombreuses valeurs semblables à des fonctions, mais le type résultant est toujours Callback <some-plain-function-type>. Cela fonctionne très similaire à std::function, sauf que std::function autorise des signatures de fonctions arbitraires.

Étant donné que votre rappel retourne un void, vous avez besoin quelque chose comme ceci:

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

compilé et testé. Et clarifié le titre de la question, car il ne s'agissait pas réellement d'un problème de type incomplet. – ptpaterson