Bonjour,
J'ai récemment appris à faire des template et je suis légèrement bloqué.
J'ai une classe bouton avec un template :
DONNEE1 est le type de l'argument qui sera utilisée pour FONCTION1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 template<typename DONNEE1, typename DONNEE2, typename FONCTION1, typename FONCTION2> class Bouton
DONNEE2 est le type de l'argument qui sera utilisée pour FONCTION2
Mais quand il n'y a pas d'argument, j'aimerais bien définir :
Bouton<void, void, ma_fonction1, ma_fonction2>
Ou quand il n'y pas une des deux fonction,
Bouton<void, void, void, ma_fonction2>
Mais quand je fait :
il le compilateur me dit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 template <typename DONNEE2, typename FONCTION1, typename FONCTION2> void Bouton<int, DONNEE2, FONCTION1, FONCTION2>::setDonneeClique() { std::cerr << "Cette fonction ne prend pas d'argument" << std::endl; }
NB : j'ai mis 'int' pour vérifié si ce n'est pas pas 'void' qui posait problèmeC:\Users\Neckara\Desktop\Patcher (sources)\src\..\include\Bouton.h|107|error: invalid use of incomplete type 'class Bouton<int, DONNEE2, FONCTION1, FONCTION2>'|
C:\Users\Neckara\Desktop\Patcher (sources)\src\..\include\Bouton.h|9|error: declaration of 'class Bouton<int, DONNEE2, FONCTION1, FONCTION2>'|
||=== Build finished: 2 errors, 0 warnings ===|
Le deuxième problème qui se pose, c'est que j'ai une classe Principale qui a deux sous-classes Bouton (jouer et desinstaller) ainsi qu'une sous-classe Serveur (gère les mises à jours).
Mais il faut que Serveur ai un pointeur de type Bouton sur chacun des deux Bouton de Principal.
Or la fonction a exécuter par le Bouton jouer est une méthode de Principal.
J'ai donc :
Dans Principal (les void * sont là parce que je n'ai pas encore réussi à mettre des void)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Bouton <void *, void *,void (*)(void *), void (Principal::*)(void *)>Jouer;
Mais pour définir un pointeur Jouer il faut que je mettre dans Serveur :
Mais Serveur ne connait pas Principal puisque Serveur est une sous-classe de Principal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Bouton <void *, void *,void (*)(void *), void (Principal::*)(void *)>* Jouer;
Si je met l'en-tête de Principal au début de celle de Serveur, ceci ne marchera pas puisque l'en-tête de Principal aura besoin de celle de Serveur avant, c'est un peu le serpent qui se mort la queue.
J'ai tenté de faire un :
Mais comme attendu ceci n'a pas marché...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 extern class Principal;
Auriez-vous des idées?
Partager