2010-11-18 24 views
2

j'ai écrit ce quelque chose comme pile structure de données:modèle de pile ne compile pas pousser func

template<class T> 
class Stos { 
    class Element { 
     public: 
     T n; 
     Element* prev; 
     Element(const T& k = 0): n(k), prev(0) {} 
    }; 
    Element* member; 
    Stos(Stos&); 
    public: 
    Stos(const T&); 
    ~Stos(); 
    unsigned int count; 
    T get(); 
    Element* push(const T&); 
    T pop(); 
    void mod(const T&); 
}; 

et la mise en œuvre (même fichier):

template<class T> 
Stos<T>::Stos(const T& n = 0): count(1) { 
    member = new Element(n); 
} 

template<class T> 
T Stos<T>::get() { 
    return member->n; 
} 

template<class T> 
Stos<T>::Element* Stos<T>::push(const T& n = 0) { 
    Element* point = member; 
    member = new Element; 
    member->prev = point; 
    if(n != 0) member->n = n; 
    ++count; 
    return member; 
} 

template<class T> 
T Stos<T>::pop() { 
    Element* point = member; 
    T n = point->n; 
    member = point->prev; 
    --count; 
    delete point; 
    return n; 
} 

template<class T> 
void Stos<T>::mod(const T& n) { 
    member->n = n; 
} 

template<class T> 
Stos<T>::~Stos() { 
    while(member) pop(); 
} 

Et quand je tente de compiler avec g ++, j'obtiens cette erreur sur la première ligne de définition de Stos::Element* Stos::push(): expected constructor, destructor, or type conversion before ‘*’ token. C'est mon premier essai d'écrire quelque chose avec des modèles. Ce code de pile a fonctionné sans modèles, quand je l'avais édité, alors j'ai eu l'erreur, tout fonctionnait juste bien avant avec "int" partout au lieu de "T".

Et je ne peux pas savoir pourquoi il ne compile pas. Je ne peux pas utiliser le pointeur sur class :: member?

Répondre

5

Vous devez préfixer le nom Element avec typename

typename Stos<T>::Element* Stos<T>::push(const T& n = 0) 

Voici un lien vers une explication complète des raisons pour lesquelles cela est nécessaire

+0

Merci, cela fonctionne. – silmeth

+1

StackOverflow devrait mettre un automatique "vous avez besoin de nom de type" lorsque la question est étiquetée C++ et "modèle" et "compiler" se trouvent dans le sujet. –

+1

Et même si "porté de VS" est contenu quelque part dans la question :-) – mmmmmmmm

2

Vous devriez également envisager d'utiliser

const T &n = T() 

au lieu de

const T &n = 0 

Depuis pas possible T peut être en mesure d'être initialisés de 0!

+0

Eh bien, je crois que je ne devrais pas laisser utiliser push() sans argument avec T inconnu ;-). – silmeth