Je rencontre des problèmes d'héritage multiple provenant d'instanciations différentes de la même classe de modèles. Plus précisément, je suis en train de le faire:Héritage multiple à partir de la classe de modèles
template <class T>
class Base
{
public:
Base() : obj(NULL)
{
}
virtual ~Base()
{
if(obj != NULL) delete obj;
}
template <class T>
T* createBase()
{
obj = new T();
return obj;
}
protected:
T* obj;
};
class Something
{
// ...
};
class SomethingElse
{
// ...
};
class Derived : public Base<Something>, public Base<SomethingElse>
{
};
int main()
{
Derived* d = new Derived();
Something* smth1 = d->createBase<Something>();
SomethingElse* smth2 = d->createBase<SomethingElse>();
delete d;
return 0;
}
Lorsque je tente de compiler le code ci-dessus, je reçois les erreurs suivantes:
1>[...](41) : error C2440: '=' : cannot convert from 'SomethingElse *' to 'Something *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1> [...](71) : see reference to function template instantiation 'T *Base<Something>::createBase<SomethingElse>(void)' being compiled
1> with
1> [
1> T=SomethingElse
1> ]
1>[...](43) : error C2440: 'return' : cannot convert from 'Something *' to 'SomethingElse *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
La question semble être l'ambiguïté en raison de l'être membre hérité à la fois la base < Quelque chose> et base de < SomethingElse>, et je peux travailler autour d'elle par disambiguating mes appels à createBase:
Something* smth1 = d->Base<Something>::createBase<Something>();
SomethingElse* smth2 = d->Base<SomethingElse>::createBase<SomethingElse>();
Cependant, t sa solution est terriblement impraticable, syntaxiquement parlant, et je préférerais quelque chose de plus élégant. De plus, je suis intrigué par le premier message d'erreur. Cela semble impliquer qu'il existe une instanciation createBase < SomethingElse> dans Base < Quelque chose>, mais comment est-ce possible? Toute information ou conseil concernant ce problème serait grandement apprécié.
Est-ce que le comportement du compilateur est correct? Je dirais que cela devrait entraîner une ambiguïté et une erreur de compilation. – jpalecek
J'ai eu des sentiments étranges à propos de l'utilisation de modèles mélangés avec l'héritage. Quoi qu'il en soit, si vous voulez éviter la syntaxe à long terme, utilisez 'typedef'. –