2012-06-29 4 views
1

Je possède ce code dans un en-tête (modifié):classes de modèles dérivés et spécialisés qui contiennent les uns des autres

template <int i> class A {}; 
template <> class A <1> { B<1> _b; }; 

template <int i> class B : public A <i> {}; 
template <> class B <1> : public A <1> {}; 

Et utiliser en quelque sorte comme ceci:

#include "template_A_B.h" 
int main() 
{ 
    A<1> a; 
    B<1> b; 
    return 0; 
} 

Il est évident que je reçois l'erreur de compilation :

error: ‘B’ does not name a type 

Si j'ajoute une déclaration avant de B comme

template <int i> class B; 

Je reçois

error: field ‘_b’ has incomplete type 

lors de la compilation.

J'ai essayé aussi déclarer avant A et de commutation de l'ordre des définitions de classe et obtenir:

error: declaration of ‘struct A<1>’ 
+1

Qu'essayez-vous d'accomplir? Toute utilisation pratique de ce type de classe? – Nawaz

+0

@Nawaz: A est une classe de tableau pouvant contenir une classe B dérivée en tant qu'élément. – steffen

Répondre

2

Dans votre formulation originale de votre question, vous simplement besoin de mettre vos spécialisations après vos déclarations avant. Ensuite, tout sera résolu correctement.

template <int i> class A; 
template <int i> class B; 

template <> class A <1> {}; 
template <> class B <1> : public A <1> {}; 

template <int i> class A { B<1> _b; }; 
template <int i> class B : public A <i> {}; 

Dans votre question révisée, vous avez créé une structure qui tente de se contenir, ce qui est interdit, même avec des types non-modèle. Par exemple, vous n'êtes pas autorisé à définir:

struct A { B b; }; 
struct B : public A {}; 

Cependant, vous pouvez exécuter quelque chose à ce que vous voulez si vous changez A d'utiliser une référence indirecte à B.

struct B; 

struct A { B *b; }; 
struct B : public A {}; 
+0

merci pour cette clarification. Je comprends mieux maintenant. En tout cas (désolé pour ça): j'ai dû éditer la question. Le membre de type B <1> est maintenant dans la version spécialisée de A. Encore une fois, erreurs de compilation ... – steffen

+0

@steffen: Vous avez défini une paire de structures avec confinement récursif. Ce n'est pas autorisé. – jxh

+0

Cela signifie-t-il que «être dérivé de» est dans ce sens similaire à «containig»? – steffen

Questions connexes