Vous mélangez des déclarations et des instanciations. Lorsque vous déclarez un modèle, vous ne spécifiez pas un type immédiatement après son nom. Au lieu de cela, déclarer comme ceci:
template<class T>
class Node {
private:
const T x_;
Node *next_;
public:
Node (const T& k, Node *next) : x_(k), next_(next) { }
const T& data(){return x_;}
Node *get_next(){return next_;}
};
Votre déclaration d'origine embrouille aussi string
, const char *
et types génériques qui devraient être en termes de T
. Pour un modèle comme celui-ci, vous voulez probablement laisser l'utilisateur définir le type du membre (x_
). Si vous le déclarez explicitement comme const char *
ou string
, vous perdez la généricité en limitant ce que l'utilisateur peut utiliser pour T
.
Notez que j'ai changé les types des variables d'instance, les paramètres du constructeur et le type de retour de data()
pour être aussi en termes de T
.
Lorsque vous instanciez réellement une variable du type de modèle, vous pouvez fournir un paramètre de type concret, par exemple.:
int main(int argc, const char **argv) {
Node<char*> *tail = new Node<char*>("tail", NULL);
Node<char*> *node = new Node<char*>("node", tail);
// do stuff to mynode and mytail
}
Chaque fois que vous écrivez le nom du modèle Node
en dehors de la déclaration de modèle, il est complet jusqu'à ce que vous fournissez une valeur pour le paramètre T
. Si vous venez de dire Node
, le compilateur ne saura pas quel genre du nœud que vous vouliez.
Ce qui précède est un peu bavard, donc vous pouvez aussi simplifier avec un typedef lorsque vous utilisez réellement:
typedef Node<char*> StringNode;
int main(int argc, const char **argv) {
StringNode *tail = new StringNode("tail", NULL);
StringNode *node = new StringNode("node", tail);
// do stuff to mynode and mytail
}
Maintenant que vous avez construit une liste chaînée de deux nœuds. Vous pouvez imprimer toutes les valeurs de la liste avec quelque chose comme ceci: Si tout va bien
for (StringNode *n = node; n; n = n->get_next()) {
cout << n->data() << endl;
}
, ceci affichera:
node
tail