2 votes

Déclaration de classe imbriquée pour l'héritage de modèles

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 {};
};

4voto

AndreyT Points 139512

Il n'y a aucun moyen de faire spécifiquement cela. Si vous devez vraiment hériter de TemplateClass<NestedClass> vous devrez déplacer le NestedClass déclaration en dehors de SomeClass .

0voto

jon-hanson Points 3912

Je ne vois pas comment vous pourriez le faire correctement. Il y a ceci :

template<class T> class TemplateClass {};

class NestedClass {};

class SomeClass : public TemplateClass<NestedClass>
{
    typedef NestedClass NestedClass;
};

mais c'est faire semblant...

-1voto

Sai Charan Points 180

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.com

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.

Powered by:

X