2010-05-15 5 views
7

Pourquoi ce code n'est-il pas valide?Modèle C++: 'n'est pas dérivé du type'

#include <vector> 

template <typename T> 
class A { 
    public: 
    A() { v.clear(); } 

    std::vector<A<T> *>::const_iterator begin() { 
     return v.begin(); 
    } 

    private: 
    std::vector<A<T> *> v; 
}; 

GCC signale les erreurs suivantes:

test.cpp:8: error: type 'std::vector<A<T>*, std::allocator<A<T>*> >' is not derived from type 'A<T>' 
test.cpp:8: error: expected ';' before 'begin' 
test.cpp:12: error: expected `;' before 'private' 

Quel est le problème? Comment le réparer?

Répondre

14

Dans cette ligne, il vous manque le mot-clé typename:

std::vector<A<T> *>::const_iterator begin(){ 

Vous avez besoin:

typename std::vector<A<T> *>::const_iterator begin(){ 

Ceci parce que std::vector<A<T> *> dépend du paramètre du modèle (T) du modèle de classe (A). Pour permettre l'analyse correcte du modèle sans avoir à faire de suppositions sur les spécialisations possibles d'autres modèles, les règles de langage exigent que vous indiquiez quels noms dépendants indiquent les types en utilisant le mot-clé typename.

3

Vous devez ajouter un nom de type car les types dépendent les uns des autres et le compilateur ne peut pas déterminer s'il s'agit réellement d'un type.

Cependant, gcc 4.5.0 je reçois un message d'erreur plus concise:

test.cc:8:3: error: need ‘typename’ before ‘std::vector<A<T>*>::const_iterator’ because ‘std::vector<A<T>*>’ is a dependent scope

Questions connexes