Problem bei Methodenaufruf von Klassentemplate



  • Hallo zusammen,

    Ich lerne gerade C++ und setze mich aktuell mit Klassen Templates auseinander. Ich habe dazu jetzt mal ein Klassentemplate geschrieben und es funktioniert auch soweit wenn ich den Code nur in der Main.cpp habe, wenn ich allerdings das ganze auf eine .h und .cpp Datei aufteile und dann die header datei in die die main.cpp inkludiere dann kriege ich die Fehlermeldungen:
    ./main.cpp:14: undefined reference to Reihe<int>::setDaten(int const&)' ./main.cpp:15: undefined reference toReihe<int>::getDaten()'

    Hier ist mein Code dazu:

    //Reihe.h
    
    #ifndef REIHE_H_
    #define REIHE_H_
    
    template <typename T>
    class Reihe {
    private:
    	T daten;
    public:
    	T& getDaten();
    	void setDaten(const T& data);
    };
    
    #endif /* REIHE_H_ */
    
    //Reihe.cpp
    #include "Reihe.h"
    
    template <typename T>
    void Reihe<T>::setDaten(const T& data){
    	daten = data;
    }
    
    template <typename T>
    T& Reihe<T>::getDaten(){
    	return daten;
    }
    
    //main.cpp
    
    #include <iostream>
    #include "Reihe.h"
    
    using namespace std;
    
    int main() {
    
    	Reihe<int> intis[5];
    	Reihe<int> test[3];
    
    	for(int i=0; i<sizeof(intis)/sizeof(int); i++){
    		intis[i].setDaten(3);
    		cout << intis[i].getDaten() << endl;
    	}
    	return 0;
    }
    

    Und so funktionierts dann

    //main.cpp
    
    #include <iostream>
    //#include "Reihe.h"
    
    using namespace std;
    
    template <typename T>
    class Reihe {
    private:
    	T daten;
    public:
        T& getDaten(){
    	return daten;
        }
        void setDaten(const T& data){
    	daten = data;
        }
    };
    
    int main() {
    	Reihe<int> intis[5];
    	Reihe<int> test[3];
    
    	for(int i=0; i<sizeof(intis)/sizeof(int); i++){
    		intis[i].setDaten(3);
    		cout << intis[i].getDaten() << endl;
    	}
    
    	return 0;
    }
    


  • Ein template muss immer komplett im Header definiert sein. Sprich, keine .cpp Datei.



  • Oh, das hat mein Lehrbuch dann wohl aber verschwiegen, es hat sogar ein extra Beispiel wie die Methoden in der .cpp Datei implementiert werden, sehr seltsam.

    Edit: Habs eben probiert, wenn ich die Methoden im Header definiere und dann in die main inkludiere dann gehts.

    Aber wieso kann ich dann eigentlich ein Objekt von der Klasse erstellen?



  • killbill schrieb:

    Aber wieso kann ich dann eigentlich ein Objekt von der Klasse erstellen?

    Warum solltest du das nicht können?



  • killbill schrieb:

    Oh, das hat mein Lehrbuch dann wohl aber verschwiegen, es hat sogar ein extra Beispiel wie die Methoden in der .cpp Datei implementiert werden, sehr seltsam.

    Unter bestimmten Bedingungen geht das, der Regelfall ist aber der Header. Möglicherweise wurde im Buch die Ausnahme beschrieben oder das Buch ist generell Schrott.



  • manni66 schrieb:

    Warum solltest du das nicht können?

    Naja dachte weil ich die Methoden nicht benutzen kann, sollte man auch kein Objekt erstellen können, ist aber wohl zu kurz gedacht.

    Kannst du mir eventuell ein paar bestimmte Bedingungen nennen, wenn es da einfache Beispiele dazu gibt?

    Das Buch heißt übrigens Schrödinger programmiert C++, wollte mal ein etwas anders geschriebenes Buch ausprobieren 🙂


Log in to reply