2010-04-29 7 views
2

Comment faire pour étendre une classe de modèle, par exemple un vecteur? Le code ci-dessous ne fonctionne pas. Le compilateur se plaint que 'Vector' n'est pas un modèle.Extension du modèle de classe

template <typename T> 
class Vector<T> : public std::vector<T> 
{ 
public: 
    void DoSomething() 
    { 
     // ... 
    } 
}; 
+6

Vous ne devriez pas hériter des conteneurs de la bibliothèque standard. Ils ne sont pas conçus pour ça. Par exemple, ils n'ont pas de destructeurs virtuels, donc si vous ne faites pas attention, votre code se cassera lorsque vos vecteurs dérivés seront détruits. – jalf

Répondre

19

Votre syntaxe est incorrecte; vous devez utiliser:

template <typename T> 
class Vector : public std::vector<T> 

Cela dit, vous ne devriez pas étendre les conteneurs de la bibliothèque standard par héritage, si pour aucune autre raison, parce qu'ils ne sont pas virtuels et Destructeurs est donc intrinsèquement dangereux. Si vous souhaitez "améliorer" std::vector, utilisez la composition (c'est-à-dire avec une variable membre de type std::vector) ou utilisez des fonctions non membres pour fournir vos fonctionnalités supplémentaires.

+0

Mais est-il possible d'hériter de STL Containers si vous n'avez aucun membre virtuel? –

6

Cela n'a rien à voir avec l'extension d'une autre classe. Le problème est votre propre classe dérivée.

Vous définissez un modèle de classe comme ceci:

template <typename T> 
class Vector 
{ 
... 

et non

template <typename T> 
class Vector<T> 
{ 
... 
+0

jalfi a raison: la classe Vector est la syntaxe Java, pas la syntaxe C++. –

+0

C'est la syntaxe pour une spécialisation, donc le compilateur s'attend à avoir vu un template de base pour 'Vector'. – UncleBens