Quelle est la bonne façon d'hériter d'une classe template dont l'argument template est une classe imbriquée dans la classe héritante ?
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass {};
};
Quelle est la bonne façon d'hériter d'une classe template dont l'argument template est une classe imbriquée dans la classe héritante ?
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass {};
};
Vous devez au moins déclarer la classe imbriquée :
class NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<NestedClass>
{
class NestedClass{};
};
Cela fonctionne. Testé sur MinGW c++ sous Windows.
Mise à jour : @jon J'ai essayé ce qui suit avec gcc version 3.4.5 sur Windows XP :
#include <iostream>
class NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<NestedClass>
{
public:
class NestedClass{
public:
int a;
static int test(){ return 100; }
};
NestedClass nc;
};
int main(){
SomeClass sc;
sc.nc.a = 10;
std::cout<< sc.nc.a << std::endl;
std::cout<< sc.nc.test() << std::endl;
}
Et j'obtiens le résultat suivant : 10 100
Mais je pense que l'intention de l'auteur (comme l'a suggéré @jon) est en fait la suivante :
class SomeClass::NestedClass;
template<class T> class TemplateClass{};
class SomeClass : public TemplateClass<SomeClass::NestedClass>
{
public:
class NestedClass{};
NestedClass nc;
};
Et cela ne fonctionne pas. La raison en est que pour pouvoir déclarer SomeClass::NestedClass dans la spécification du modèle, SomeClass aurait dû être déclarée. Or, c'est exactement ce que nous essayons de faire, d'où l'apparition d'une dépendance cyclique.
Je pense donc que la réponse de @jon est celle qui résout le mieux ce problème.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.