2013-03-11 1 views
2

J'essaye d'écrire un adaptateur de récipient. Je veux également utiliser les définitions de type de la classe de base dans la classe dérivée. J'ai donc essayé ce qui suit ...typedef inconnu dans la classe dérivée

template <class CONTAINER> class SequenceComposite { 
protected: 
    CONTAINER m_data; 
public: 
    typedef typename CONTAINER::size_type size_type; 
    // ... 
}; 

template <class DTYPE> 
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> > { 
public: 
    size_type capacity() const { m_data.capacity(); } 
    // ... 
}; 

Je suis arrivé cette erreur ...

error: ‘size_type’ does not name a type 
note: (perhaps ‘typename SequenceComposite<std::vector<T> >::size_type’ was intended) // yes, it was 

Comment puis-je dire au compilateur que je veux utiliser le typedef de la classe de base?

Répondre

4

J'ai pu obtenir ce travail, voici un bon article sur Dependent name lookup for C++ templates et this couvre comment résoudre le problème avec m_data:

template <class DTYPE> 
class VectorComposite : public virtual SequenceComposite< std::vector<DTYPE> >  
{ 
public: 
    typedef typename SequenceComposite< std::vector<DTYPE> >::size_type size_type ; 

    size_type capacity() const 
     { 
      this->m_data.capacity() ; 
     } 
    // ... 
}; 

Sinon, vous pouvez également utiliser using:

using typename SequenceComposite< std::vector<DTYPE> >::size_type ; 

Bien que je ne pense pas que cela fait beaucoup mieux, jrok a proposé une solution encore mieux:

typename VectorComposite::size_type capacity() const 
{ 
    this->m_data.capacity() ; 
} 
+0

Hmm ... ce n'était pas prévu. Cela signifierait de redéfinir tous les types déjà définis. – Michael

+0

@Michael Vous pouvez également utiliser 'using', j'ai ajouté cet exemple aussi. –

+0

La solution proposée @ Michael par 'jrok' est encore mieux –

1

de cette façon de Put la base size_type:

typename SequenceComposite<std::vector<DTYPE>>::size_type capacity() const{ //.. 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+0

'typename VecteurComposite :: taille_type capacity() const {this-> m_data.capacity(); } 'fonctionne aussi bien – Michael

2

Dans le contexte du type dérivé, size_type est un nom non-dépendant, et en tant que tel, il sera recherché dans le contexte du modèle sans instancier les modèles de base. Si vous avez besoin de l'utiliser, la chose la plus simple est de clone le typedef dans le type dérivé:

typename VectorComposite::size_type size_type; // [*] 

[*] Après la correction de JROK au code incorrect d'origine.

+0

Ai-je manqué quelque chose que je n'ai pas réussi à faire fonctionner cette syntaxe, je dois utiliser la syntaxe dans mon exemple pour que cela fonctionne. –

+0

@ShafikYaghmour: vous avez raison, le nom injecté ne peut pas être utilisé directement. Enlever la réponse –

+0

Je voudrais juste l'amender, votre explication initiale était bien meilleure que la mienne. –

Questions connexes