linked list klasse met klassetemplate

Status
Niet open voor verdere reacties.

retoke

Gebruiker
Lid geworden
17 aug 2007
Berichten
16
De bedoeling is om van mijn klasse linkedlist een template klasse te maken zodat ik meer dan alleen strings of ints in mijn linked list kan stoppen.
De linkedlist klasse heb ik zelf al geschreven maar het probleem doet zich voor als ik er een klasse template van wil maken.
Ik krijg een error zoals dit dan:
ISO C++ forbids declaration of `element' with no type

Dit is mijn originele klasse:

Code:
#include <sstream>
#include <iomanip>

using namespace std;
struct element {
                string num; 
                element *volg;
                };

class linkedlist {
      private:
              element *start;
      public:
             linkedlist(){
                
                 start = 0;
                 }
                 
             ~linkedlist(){
                element *p;
                while(start!= 0){
                  p = start;
                  start = start->volg;
                  delete p;
                  }
                }            
                 
       void push(string x){
            element *p = start;
            start = new element;
            start->volg = p;
            start->num = x; 
            }
            
       void toon(){
         for (element* p = start; p!=0; p=p->volg){
          cout << p->num <<" ";
          }
          cout << endl;
       }
       bool isLeeg(){
            return (start == 0);
            }
       
       string pop(){
           string temp = start->num;
           element *p;
           
                  p = start;
                  start = start->volg;
                  delete p;
            return temp;      
            }
            
 };

Dit is de aangepaste versie waarbij ik dus die error kreeg (er waren meer als één error):
Code:
#include <iomanip>

using namespace std;
template <class S>
struct element {
                S num; 
                element *volg;
                };
template <class T>
class linkedlist {
      private:
              element *start;
      public:
             linkedlist(){
                
                 start = 0;
                 }
                 
             ~linkedlist(){
                element *p;
                while(start!= 0){
                  p = start;
                  start = start->volg;
                  delete p;
                  }
                }            
                 
       void push(T x){
            element *p = start;
            start = new element;
            start->volg = p;
            start->num = x; 
            }
            
       void toon(){
         for (element* p = start; p!=0; p=p->volg){
          cout << p->num <<" ";
          }
          cout << endl;
       }
       bool isLeeg(){
            return (start == 0);
            }
       
       string pop(){
           string temp = start->num;
           element *p;
           
                  p = start;
                  start = start->volg;
                  delete p;
            return temp;      
            }
            
 };

Nu mijn vraag: weet iemand wat er hier mis is en hoe ik deze linked list kan maken zodat ik zowel met strings als met ints kan werken met behulp van een klasse template?
(voor de duidelijkheid: in mijn main programma kan ik dan zowel lijst.push("eenstring"); doen als lijst.push(123); doen.

Dank bij voorbaat
 
Als ik:
Code:
template <class T>
class linkedlist {
      private:
              element *start;
      public:
             linkedlist(){
                
                 start = 0;
                 }
                 
             ~linkedlist(){
                element *p;
                while(start!= 0){
                  p = start;
                  start = start->volg;
                  delete p;
                  }
                }            
                 
       void push(T x){
            element *p = start;
            start = new element;
            start->volg = p;
            start->num = x; 
            }
            
       void toon(){
         for (element* p = start; p!=0; p=p->volg){
          cout << p->num <<" ";
          }
          cout << endl;
       }
       bool isLeeg(){
            return (start == 0);
            }
       
       string pop(){
           string temp = start->num;
           element *p;
           
                  p = start;
                  start = start->volg;
                  delete p;
            return temp;      
            }
            
 };

Vervang met:
Code:
template <class T>
class linkedlist {
      private:
              element<T> *start;
      public:
             linkedlist(){
                
                 start = 0;
                 }
                 
             ~linkedlist(){
                element<T> *p;
                while(start!= 0){
                  p = start;
                  start = start->volg;
                  delete p;
                  }
                }            
                 
       void push(T x){
            element<T> *p = start;
            start = new element<T>;
            start->volg = p;
            start->num = x; 
            }
            
       void toon(){
         for (element<T>* p = start; p!=0; p=p->volg){
          cout << p->num <<" ";
          }
          cout << endl;
       }
       bool isLeeg(){
            return (start == 0);
            }
       
       T pop(){
           T temp = start->num;
           element<T> *p;
           
                  p = start;
                  start = start->volg;
                  delete p;
            return temp;      
            }
            
 };

Wil hij bij mij gewoon compilen.

Wat heb ik veranderd.
1. Pop returned nu niet standaard meer een string, maar iets van het type T. Wat ook in de elementen hoort te zitten.

2. Aangezien element gedefinieerd is via aan template, moet je bij het declareren van een element aangeven worden welk type er bij de template ingevuld moet worden. Overal stond element, wat in element<T> moest worden veranderd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan