Class Templates Problem



  • Hallihallo,

    Ich bin grad mit einer recht seltsamen Fehlermeldung überfordert.
    Beschäftige mich mit Klassentemplates. Hab auch alles brav in die Header Datei gemacht.

    #include <cstdlib>
    #include <iostream>
    #include <deque>
    #include <iterator>
    
    using namespace std;
    
    template<typename T>
    class List {
    public:
        List(){
            pos = 0;
        };
        List(const List& orig);
    
        virtual ~List();
    
        bool end(){
            if(pos == deq.size())
                return true;
            else
                return false;
        };
    
        void ins(T element){
            deq.insert(deq.begin()+pos, element);
        };
    
        void adv(){
            if(pos != deq.size())
                pos = pos+1;
            else
                cout << "Pos kann nicht weiter verschoben werden" <<endl;
        };
    
        void del(){
            deq.erase(deq.begin()+pos);
        };
    
        T get(){
            return deq[pos];
        };
    
        void reset(){
            pos = 0;
        };
    
        void show(){
            cout << "List ausgeben: " <<endl;
            for(int i = 0; i< deq.size();i++)
                cout << deq[i];
        };
    private:
        deque<T> deq;
        int pos;
    
    };
    

    In der main hab ich bis jetzt nur ein Objekt erzeugt.

    int main(int argc, char** argv) {
    
        List<int> l;
    
        return 0; // Fehlermeldung
    }
    

    Beim Return kommt die Fehlermeldung:
    "Relocation truncated to fit: R_X86_64_PC32 against undefined symbol 'List<int>::~List()'

    Weiß jemand was das bedeutet?

    Danke für euren Rat 🙂



  • Du hast aus unerklärlichen Gründen einen virtuallen Destruktor deklariert, ihn aber nirgends definiert.
    Lösche ihn am besten, er ist überflüssig.



  • Nathan schrieb:

    Du hast aus unerklärlichen Gründen einen virtuallen Destruktor deklariert, ihn aber nirgends definiert.
    Lösche ihn am besten, er ist überflüssig.

    Ups. Der wurde automatisch erzeugt.
    Danke. Brauch ich nicht stattdessen einen anderen Destruktor?



  • Cabooze schrieb:

    Danke. Brauch ich nicht stattdessen einen anderen Destruktor?

    Nein, wozu solltest du einen brauchen?
    Und der Kopierkonstruktor ist ebenfalls überflüssig und nicht implementiert.



  • Okay. Ist entfernt.
    Jetzt hab ich aber nochmal ein anderes Problem mit einer anderen Klasse. Hab noch eine zweite Klasse gemacht. Ich bekomme die selbe Fehlermeldung, nur dass er diesmal was gegen den Konstruktor hat und nicht den Destruktor. Aber den kann ich doch nicht weglassen???

    relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Queue<int>::Queue()'

    template<typename T>
    class Queue {
    public:
        Queue();
    
        void empty(){
            l.erase(l.begin(), l.end());
        };
        void enq(T element){
            l.insert(l.begin(),element);
        };
        void deq(){
            l.erase(l.end());
        };
        T front(){
            l.front();
        };
    
        void show(){
            for(list<T>::const_iterator i = l.begin(); i != l.end(); i++){
                cout << *i << " ";
            }
            cout << endl;
        };
    private:
        list<T> l;
    
    };
    


  • 1. Natürlich kannst du ihn weglassen
    2. Du hast ihn wieder nicht implementiert

    Bevor du dich mit Templates beschäftigst, solltest du Grundlagen zu Klassen beherrschen.



  • Okay. Das war mir jetzt neu.

    Allerdings kommt die Fehlermeldung immernoch. Der Konstruktor ist weg.

    int main(int argc, char** argv) {
    
        Queue<int> q; // Die Fehlermeldung kommt diesmal hier. Nicht beim return
    
        return 0;
    }
    


  • Kann eigentlich nicht, wenn du ihn wirklich entfernt hast.



  • Er ist 100%ig weg 😃



  • Cabooze schrieb:

    Er ist 100%ig weg 😃

    Rebuild all



  • manni66 schrieb:

    Cabooze schrieb:

    Er ist 100%ig weg 😃

    Rebuild all

    Oh. BÄM :D. Klappt. Dankesehr^^


Anmelden zum Antworten