2009-01-14 11 views
11

C++ ne peut pas créer de modèle à partir d'un typedef ou d'un typedef d'une classe basée sur un modèle. Je sais que si j'hérite et fais de ma classe un modèle, ça marchera.Héritage au lieu de typedef

Exemples:

// Illegal 
template <class T> 
typedef MyVectorType vector<T>; 

//Valid, but advantageous? 
template <class T> 
class MyVectorType : public vector<T> { }; 

fait ce avantageux pour que je puisse « faux » ou un typedef sont là de meilleures façons de le faire?

+0

question similaire, les mêmes réponses: http://stackoverflow.com/questions/293988/generic-vector-of-vectors-in-c –

+0

Votre deuxième exemple est également invalide. Vous devrez écrire vos propres constructeurs pour MyVectorType puisque vous ne pouvez pas les hériter. – Sebastian

Répondre

13

C++ 0x ajoutera typedefs de modèle en utilisant le mot-clé using.

Votre solution déclare un nouveau type, pas un "alias" de type, par ex. vous ne pouvez pas initialiser un MyVectorType & (référence) avec un vector<T>. Cela pourrait ne pas être un problème pour vous, mais si elle est, mais vous ne voulez pas faire référence à vecteur dans votre code, vous pouvez le faire:

template <typename T> 
class MyVectorType { 
public: 
    typedef std::vector<T> type; 
}; 
+0

std :: vector a un destructeur non virtuel donc vous devez faire attention à ne pas supprimer un MyVectorType via un std :: vector * –

+0

Je ne proposais pas d'utiliser MyVectorType comme le type de données réel, mais plutôt MyVectorType :: type, qui est un typedef pour std :: vector , donc pas de danger ici. –

10

L'héritage n'est pas ce que vous voulez. Une approche plus idiomatiques pour émulant un typedef basé sur un modèle est la suivante:

template <typename T> struct MyVectorType { 
    typedef std::vector<T> t; 
}; 

Référez-vous au typedef comme ceci:

MyVectorType<T>::t; 
1

C++ ne peut pas faire un modèle d'un typedef ou typedef une classe modélisée.

Cela dépend de ce que vous entendez par typedef: std::vector<size_t> est légal - même si size_t est un typedef - et std::string est un typedef pour std::basic_string<char>.