2013-07-04 3 views
2

Voici une version allégée d'un code de liste des modèles (adapté de http://www.daniweb.com/software-development/cpp/threads/237391/c-template-linked-list-help)modèle en utilisant un autre modèle

Liste se plaint (erreur de compilation) que « nœud est pas un type ». Pourquoi est-ce, et quelle est la solution?

J'ai essayé de remplacer le "Node de classe" par un "struct Node" (et les changements liés), et la version de struct a bien fonctionné. Donc, la question principale semble être: comment une classe-modèle accède-t-elle à une autre classe-modèle?

#include <iostream> 
using namespace std; 

template <typename T> 
class Node 
{ 
    public: 
     Node(){} 
     Node(T theData, Node<T>* theLink) : data(theData), link(theLink){} 
     Node<T>* getLink() const { return link; } 
     const T getData() const { return data; } 
     void setData(const T& theData) { data = theData; } 
     void setLink(Node<T>* pointer) { link = pointer; } 
    private: 
     T data; 
     Node<T> *link; 
}; 

template <typename T> 
class List { 
    public: 
     List() { 
      first = NULL; 
      last = NULL; 
      count = 0; 
     } 
     void insertFirst(const T& newData) { 
      first = new Node(newData, first); 
      ++count; 
     } 
     void printList() { 
      Node<T> *tempt; 
      tempt = first; 
      while(tempt != NULL){ 
       cout << tempt->getData() << " "; 
       tempt = tempt->getLink(); 
      } 
     } 
     ~List() { } 

    private: 
     Node<T> *first; 
     Node<T> *last; 
     int count; 
}; 

int main() { 
    List<int> myIntList; 
    cout << "Inserting 1 in the list...\n"; 
    myIntList.insertFirst(1); 
    myIntList.printList(); 
    cout << endl; 
    List<double> myDoubleList; 
    cout << "Inserting 1.5 in the list...\n"; 
    myDoubleList.insertFirst(1.5); 
    myDoubleList.printList(); 
    cout << endl; 
} 
+2

* "Liste se plaint (erreur de compilation) que « nœud est pas un type » * Toujours ajouter l'erreur exacte et la ligne – Zeta

Répondre

3

Vous utilisez

new Node(newData, first); 

dans le modèle List. À ce stade, Node ne fait pas référence à un type, mais à un modèle. Mais bien sûr pour créer une instance d'un type avec new, vous avez besoin d'un type là.

La chose la plus probable que vous voulez faire est de faire un type par instanciation le modèle, à savoir

new Node<T>(newData, first); 
+0

Merci, cette correction a fonctionné – R71

+0

J'ai une autre question liée à ce code: Dans le code ci-dessus, la classe de noeud est visible pour les autres classes Si je veux faire cet imbriqué sous Liste, comment J'ai essayé de déplacer le code, mais je me suis d'abord plaint du "type de noeud non-modèle utilisé comme modèle" – R71

+0

@Rog: vous pourriez vouloir poser cette question comme une question distincte , mais comme un indice rapide: si Node est imbriqué dans List, il n'y a aucune raison pour que Node soit un template. – PlasmaHH

Questions connexes