Bonjour à tous !
Avec l'architecture suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class SousClasse {}; class SousClasseDerivee1 : public SousClasse {}; class SousClasseDerivee2 : public SousClasse {};Je rencontre le problème suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class Interface {}; template<typename T> class Abstraction : public Interface {}; class Derivee1 : public Abstraction<SousClasseDerivee1> {}; class Derivee2 : public Abstraction<SousClasseDerivee2> { void someStuff(Derivee1& d); };
En compilant sous Linux avec g++ 4.8.4, j'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Derivee2::someStuff(Derivee1& d) { Interface* brol(this); // <- Pas de problème Interface* trol(&d); // <- Refuse de compiler }
error: cannot convert 'Derivee1*' to 'Interface*' in initialization
Ok, Derivee1 et Derivee2 n'héritent pas directement de la même classe.
Mais si on remonte jusqu'en haut, les 2 héritent pourtant de Interface -> Pourquoi cette erreur ? (sans compter que g++ arrive à déterminer que Derivee2 est-un Interface)
Si c'est quelque chose qui est interdit par le C++, avez-vous des idées d'architecture permettant de palier ce problème ?
Merci d'avance
Partager