Heritage-Spécialisation d'un template
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 :
Code:
1 2 3 4 5 6 7
| typedef double Pitch_t;
typedef enum {
kNote_La = 0,
kNote_Sib = 1,
...
kNote_None = 12
} NoteID_t; |
J'ai donc créer un template indicateur de la façon suivante :
Code:
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;
}; |
et des classes héritées-spécialisées de la manière suivante:
Code:
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 |
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.
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 :
Code:
1 2 3 4 5 6
| PitchIndicator::PitchIndicator(...)
: ViewIndicator(...)
PitchIndicator::PitchIndicator(...)
: ViewIndicator<Pitch_t>::ViewIndicator(...)
{} |
Le premier génère une error de compilation :
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