Bonjour à tous, je découvre les templates depuis hier et je m'ARRACHE les cheveux... Je vais essayer de résumer mon problème, peut-être pourrez-vous m'aider à trouver une solution ou bien m'indiquer un meilleur design. Je poste uniquement du code exemple sinon ce serait trop long à lire.
J'ai 2 classes : Surface et Media (et demain d'autres), elle ne dérivent pas d'une classe commune et leurs constructeurs n'attendent pas les mêmes paramètres.
J'ai besoin d'ajouter à ces classe la capacité d'interpoler des valeurs dans le temps. Au début j'ai pensé à l'héritage multiple (dériver Surface et Media d'une classe Interpolator), ça aurait fonctionné sans problème. Mais comme j'ai lu que l'héritage multiple était quelque chose de très mal, j'ai voulu essayer avec des templates.
Donc j'ai écrit
- une classe Interpolator
- un template Interpolable
Qui sont définis comme ceci
Je passe sur les détails, ça fonctionne et je l'utilise comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 struct Interpolator { Interpolator(float* theRef) { } Interpolator(int* theRef) { } void update() {} }; template <class T> struct Interpolable : public T { vector<Interpolator> interpolators; template<typename T2> void interpolate(T2* value) { Interpolator it(value); interpolators.push_back(it); } void update() { T::update(); while(interpolators.size() > 0) for(int i=0; i<interpolators.size(); i++) { interpolators[i].update(); } } };
Là ou ça se barre en sucette c'est quand j'utilise autre chose que les constructeurs par défaut, donc si ma classe Media défini un constructeur
Code : Sélectionner tout - Visualiser dans une fenêtre à part Interpolable<MediaVideo> *mv1 = new Interpolable<MediaVideo>;
J'ai essayé toute sortes de choses, la plus logique étant
Code : Sélectionner tout - Visualiser dans une fenêtre à part Media(int ID) {};
J'obtiens invariablement un message d'erreur à la compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Interpolable<MediaVideo> *mv1 = new Interpolable<MediaVideo>(1);
Je ne comprends pas ce qui lui pose problème, tout ça est totalement opaque pour moi...templ2.cpp:96:67: error: no matching function for call to 'Interpolable<MediaVideo>::Interpolable(int)'
Interpolable<MediaVideo> *mv1 = new Interpolable<MediaVideo>(1);
^
templ2.cpp:96:67: note: candidates are:
templ2.cpp:73:8: note: Interpolable<MediaVideo>::Interpolable()
struct Interpolable : public T
^
templ2.cpp:73:8: note: candidate expects 0 arguments, 1 provided
templ2.cpp:73:8: note: Interpolable<MediaVideo>::Interpolable(const Interpolable<MediaVideo>&)
templ2.cpp:73:8: note: no known conversion for argument 1 from 'int' to 'const Interpolable<MediaVideo>&'
Merci de votre aide !
Partager