2010-07-22 3 views
1

est la suivante valide ?:possibilités de modèle emboîtées

template<typename T> class C { C1<C2<T>> someMember; }; 
+3

Qu'est-ce que vous essayez d'accomplir exactement? – Jordan

+0

J'en ai pris ce que je peux, mais c'est une très mauvaise question. Nous n'avons aucune idée de ce que sont «C1» et «C2», nous ne savons pas quel est votre vrai problème et quels sont vos objectifs. Non, ce n'est pas valide car 'C1' et' C2' ne sont pas définis, ou même s'ils étaient tels que je les ai définis, maintenant ce n'est pas valide parce que '>>' est l'opérateur de décalage correct. Et si nous introduisons un espace, ce n'est pas valide parce que vous avez simplement nommé un type et que vous n'avez rien déclaré. Beaucoup trop incomplet; Fournissez du vrai code, de vrais problèmes et de vrais objectifs si vous voulez de vraies réponses. – GManNickG

+0

La réponse que vous avez fournie est réelle. – user383352

Répondre

5

Eh bien, vous aurez besoin de faire quelque chose avec le type, que ce soit en faire un typedef ou un membre, mais oui:

template <typename T> 
struct C1 {}; 

template <typename T> 
struct C2 {}; 

template <typename T> 
struct C 
{ 
    typedef C1<C2T> > type; // note the space! 
}; 

>> est en fait l'opérateur de décalage droit, donc vous avez besoin d'un espace là pour qu'il fonctionne correctement. En C++ 0x, cependant, vous pouvez simplement taper >>; il est très bien analysé. *

* Certains compilateurs clémentes vont actuellement l'accepter.

1

Erm, non, du moins pas dans l'isolement, parce que vous avez pas de définition pour C1 et C2. En supposant qu'ils sont définis comme des classes modèle avec un argument, alors non, il est toujours pas valable pour la même raison que int; est pas valide - ce n'est pas une déclaration complète, juste un typename.

Maintenant, si vous vous posez sur la syntaxe avec les crochets, ignorant alors toutes les autres questions, qui est valable uniquement dans C++ 0x. Dans la norme C++ actuelle, l'analyse est ambiguë et vous devez la composer comme C1<C2<T> >.

1

Bien sûr, je l'ai utilisé:

vector< pair<int, int> > blah; 

avant.