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

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();
     }
   }
};
Je passe sur les détails, ça fonctionne et je l'utilise comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Interpolable<MediaVideo> *mv1 = new Interpolable<MediaVideo>;
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
J'ai essayé toute sortes de choses, la plus logique étant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Interpolable<MediaVideo> *mv1 = new Interpolable<MediaVideo>(1);
J'obtiens invariablement un message d'erreur à la compilation :
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>&'
Je ne comprends pas ce qui lui pose problème, tout ça est totalement opaque pour moi...

Merci de votre aide !