Eventueller Headerdateien Fehler



  • Hi,
    Ich wollte ein vereinfachte Container-Klasse schreiben, wozu man keine Iteratoren verwennden muss.
    Hier erstmal mein Code (liste.h):

    #include <iostream>
    #include <list>
    
    using namespace std;
    
    template <class T>
    class liste {
      public:
      void add(T value);
      void addrange(const T* value);
      void remove(int pos);
      void remove_all(T value);
      void remove_range(int pos, int count);
      void clear(void);
      void sort(void);
      void insert(int pos, T value);
      void swap(int pos1, int pos2);
      void change(int pos, T value);
      T item(int pos);
      int count();
      int max_size();
    
      private:
    
      list<T> liste;
      list<T>::iterator it;
    };
    

    Fehler bei 26 (list<T>::iterator it;) :
    error: expected ';' before "it"

    Und hier meine eigentliche Klasse (liste.cpp):

    #include "liste.h"
    
    #ifndef LISTE_H
    #define LISTE_H
    
    template <class T>
    class liste {
    
        void add(T value) {
        it = liste.end();
        liste.insert(it, value);
        }
    
        T item(int pos) {
         it = pos;
         return *it;
        }
    };
    #endif
    

    Zwei Fehler bei 7 (class liste {) :
    error: redefinition of 'class liste<T>'
    error: previous definition of 'class liste<T>'

    Kann mir da einer helfen? Wäre echt nett.
    Mfg
    Mike



  • Das ist ein Typname den der zu dem Zeitpunkt noch nicht kennt.
    Darum:

    typename list<T>::iterator it;
    

    Oder besser mit einem typedef den ganzen ausdruck mal definieren.



  • Und include-Guards haben in Implementierungsdateien nichts zu suchen.



  • Der zweite Fehler ist der, dass du die Klasse neu definierst (wie der Fehler schon sagt).
    Du willst ja sicherlich nur die Methoden implementieren.
    Also musst du in deine liste.cpp schreiben:

    liste<T>::add(T elem)
    {
      // Implementierung...
    }
    

    u.s.w.

    So würdest du es zumindest machen, wenn es keine Templateklasse wäre.
    Bei Templates solltest du das direkt im header implementieren.
    Dazu findest du aber viel in den FAQ's.

    Also sieht dein Header dann so aus, wie du es schon im cpp-File angefangen hast.
    Anders gehts nur mit export oder anderen Tricks aber das ist dann nicht mehr portabel.



  • Habs jetzt so probiert (.cpp):

    #include "liste.h"
    #include <iostream>
    #include <list>
    
    #ifndef LISTE_H
    #define LISTE_H
    
    template <class T>
    class liste {
    
        list<T> liste;
        list<T>::iterator it;
    
        liste<T>::add(T value) {
        it = liste.end();
        liste.insert(it, value);
        }
    
        liste<T>::item(int pos) {
         it = pos;
         return *it;
        }
    };
    #endif
    

    Und die Headerdatei:

    template <class T>
    
    class liste {
      public:
      void add(T value);
      void addrange(const T* value);
      void remove(int pos);
      void remove_all(T value);
      void remove_range(int pos, int count);
      void clear(void);
      void sort(void);
      void insert(int pos, T value);
      void swap(int pos1, int pos2);
      void change(int pos, T value);
      T item(int pos);
      int count();
      int max_size();
    };
    

    Die letzten beiden Fehler sind immer noch da und ich weiß nicht, wie ich diese entfernen kann. Habe das ausprobiert, was ihr gesagt habt, aber das mit typename hat auch nicht geklappt habe also die zwei Variablen (bei denen es auch bleibt), in der Quellcode-Datei deklariert.

    Weiß da einer was?

    Mfg
    Mike



  • Siehe meinen letzten Post in diesem Thread:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-271458.html

    Lg freeG



  • Nein die cpp kannste vergessen.
    Lösch die sofort ^^.

    Ich meinte das so etwa:
    (liste.h)

    #ifndef _LISTE_H_
    #define _LISTE_H_
    
    template <typename T>
    class liste
    {
    public:
      void add(T value) 
      {
        it = liste.end();
        liste.insert(it, value);
      }
    
      liste<T>::item(int pos) {
        it = pos;
        return *it;
      }
      // Und so weiter
    
      typename list<T>::iterator it;
    private:
    
    };
    

    Also alles ins header-File reinquetschen und das typename nicht vergessen.



  • Die letzten beiden Fehler sind immer noch da und ich weiß nicht, wie ich diese entfernen kann. Habe das ausprobiert, was ihr gesagt habt, aber das mit typename hat auch nicht geklappt habe also die zwei Variablen (bei denen es auch bleibt), in der Quellcode-Datei deklariert.

    Ich befürchte, dass du ein grundlegendes Problem mit dem arbeiten mit Klassen in C++ hast. Konsultier am besten ein gutes Buch, denn wie du auf so ein Konstrukt kommst kann ich mir nur durch unzureichende Kenntnisse erklären.


Log in to reply