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
{};
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);
};
Je rencontre le problème suivant
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
}
En compilant sous Linux avec g++ 4.8.4, j'obtiens l'erreur suivante :
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