Problem mit Template Klasse

  • C++

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Problem mit Template Klasse

    Guten Abend,
    Ich hab ein Problem mit meiner Template Klasse, ich bekomme vom Compiler(GCC 4.8) "undefined reference to 'Funktion' " Fehler. Ich weis nicht worin der Fehler liegt,vermute ihn aber in der Definition der Funktionen.Könnt ihr mir sagen,wo ich meinen Fehler hab?
    Notecard.h

    C-Quellcode

    1. /*
    2. * Notecard.h
    3. *
    4. * Created on: 06.05.2014
    5. * Author: rico
    6. */
    7. #ifndef NOTECARD_H_
    8. #define NOTECARD_H_
    9. #include <iostream>
    10. #include <string>
    11. namespace LearnHelper {
    12. template<class T>
    13. class Notecard {
    14. public:
    15. Notecard();
    16. ~Notecard();
    17. std::string getTitle() const {return Title;}
    18. void setTitle(const std::string &title) {Title = title;}
    19. T getContent() const {return Content;}
    20. void setContent(const T &content) {Content = content;}
    21. bool getKnown() const {return known;}
    22. void setKnown(const bool &known) {this->known = known;}
    23. std::string getQuestion() const {return Question;}
    24. void setQuestion(const std::string& question) {Question = question;}
    25. int getRepeated() const {return repeated;}
    26. Notecard operator++(int unused);
    27. Notecard& operator++();
    28. protected:
    29. std::string Title;
    30. std::string Question;
    31. T Content;
    32. bool known;
    33. int repeated;
    34. };
    35. } /* namespace LearnHelper */
    36. #endif /* NOTECARD_H_ */



    Notecard.cpp

    C-Quellcode

    1. /*
    2. * Notecard.cpp
    3. *
    4. * Created on: 06.05.2014
    5. * Author: rico
    6. */
    7. #include "Notecard.h"
    8. namespace LearnHelper {
    9. template<class T>
    10. Notecard<T>::Notecard() {
    11. // TODO Auto-generated constructor stub
    12. repeated = 0;
    13. }
    14. template<class T>
    15. Notecard<T>::~Notecard() {
    16. // TODO Auto-generated destructor stub
    17. }
    18. template<class T>
    19. Notecard<T> Notecard<T>::operator ++(int unused)
    20. {
    21. repeated++;
    22. return *this;
    23. }
    24. template<class T>
    25. Notecard<T>& Notecard<T>::operator++()
    26. {
    27. ++repeated;
    28. return *this;
    29. }
    30. } /* namespace LearnHelper */



    C-Quellcode

    1. /*
    2. * main.cpp
    3. *
    4. * Created on: 06.05.2014
    5. * Author: rico
    6. */
    7. #include <iostream>
    8. #include <memory>
    9. #include "Notecard.h"
    10. int main(int argc, char*argv[])
    11. {
    12. LearnHelper::Notecard<std::string> card1; //undefined reference to `LearnHelper::Notecard<std::string>::Notecard()' selber Fehler für den Destruktor
    13. std::cout<<(++card1).getRepeated()<<std::endl; //undefined reference to `LearnHelper::Notecard<std::string>::operator++()'
    14. return 0;
    15. }
    Vielen Dank erstmal :) . Im Header kompiliert er ohne zu meckern. Er meckert aber auch erst,seitdem ich ne Template Klasse draus gemacht hab.

    Edit:// Hab auch überprüft, ob Eclipse vllt das makefile falsch generiert, jedoch wirft er die Fehler auch beim normalen Compiler aufruf

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rykoJLL“ ()

    Du musst alles in den Header packen, da der Compiler sonst nicht mitkommt. Die Dateien kompilieren nämlich seperat. So macht man's auch eigentlich. Ausserdem fehlen dir etliche Semikolon. Nach jeder Methode und Namespace im Header. Zudem übergibt man fundamentale Typen per Value nicht per Referenz (const bool& => bool).

    C-Quellcode

    1. namespace y
    2. {
    3. class x
    4. {
    5. public:
    6. x() {cout << "Hallo" << endl;};
    7. };
    8. };
    Okay Zusammengefasst heißt dass die Definition der Template Funktionen müssen in den Header und fundamentale Typen per Value übergeben. Sind die Semikolon notwendig ? Kompiliert ja auch ohne.
    Vielen Dank für deine Hilfe, bis dato :thumbsup:
    Richtig. Und ja die Semikolon sind nötig, andere Compiler werden es vielleicht nicht kompilieren. Visual Studio schmeist dir etliche Fehler. Generell haben Conpiler damit Probleme Semikolon zu erkennen, in Visual Studio kannst du manchmal 3 hinter einander machen und es kommt kein Fehler, trotzdem ists natürlich falsch.