Salut à tous
J'ai un petit souci avec des templates que je voudrais hériter tout en spécialisant le type. Je vais essayer d'être clair.
Pour le contexte je suis en train de développer un petit accordeur numérique sous forme de AudioUnit (format de plugin audio Apple), et pour la vue (autrement dit la Gui), je vais mettre en place deux indicateurs : un qui affiche la note jouée et un autre qui affiche l'écart avec la note exacte (le pitch).
Ce qu'affichent les indicateurs dépend de données de types différents :J'ai donc créer un template indicateur de la façon suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef double Pitch_t; typedef enum { kNote_La = 0, kNote_Sib = 1, ... kNote_None = 12 } NoteID_t;
et des classes héritées-spécialisées de la manière suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 template <class T> class ViewIndicator { public: ViewIndicator (...); virtual ~ViewIndicator (); void getData(); // va chercher les données dans la partie audio du plugin virtual void draw(); protected: T mData; };
Les fonctions draw() des classes héritées appellent d'abord ViewIndicator::draw() pour dessiner l'arrière-plan de l'afficheur puis utilise mData pour afficher ce qu'il faut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class PitchIndicator : public ViewIndicator<Pitch_t> { public: PitchIndicator (...); ~PitchIndicator(); void draw (); }; // idem pour NoteIndicator
Là ou ça se gate, c'est dans l'implémentation, notamment l'initialisation par les super-constructeurs : j'ai fais (entre autres) deux essais :
Le premier génère une error de compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 PitchIndicator::PitchIndicator(...) : ViewIndicator(...) PitchIndicator::PitchIndicator(...) : ViewIndicator<Pitch_t>::ViewIndicator(...) {}
error: no matching function for call to 'ViewIndicator<Pitch_t>::ViewIndicator()'
error: class 'PitchIndicator' does not have any field named 'ViewIndicator'
Le second compile mais génère des erreurs de linking comme quoi il lui manque ViewIndicateur<double> et ViewIndicateur<NoteID_t>
Je suis prêt à envisager d'autres conceptions, seulement j'aimerais garder si possible le mécanisme d'héritage qui me permet d'automatiser un certain nombre de choses (d'autant plus que j'ai l'intention d'inclure la classe ViewIndicator dans API, il faudrait donc que les utilisateurs aient le moins possible à écrire, par exemple ne surcharger que la fonction draw()).
Merci d'avance
Rémi
Partager