Nichtaufgeloestes externes Symbol seit benutzung von Templates

VanHellsehn

Erfahrenes Mitglied
Hey Leute ich und ein Freund kommen einfach nicht weiter seit dem ich ein Template mit in meine Klasse gebaut habe.
Hier ist mal mein Code wäre cool wenn ihr mir helfen könnt:

main.cpp
C++:
#include <string>
#include <iostream>
using namespace std;

#include <windows.h>

#include "listea.h"

void main(void)
{
	listea<string> my_list;
}
listea.h
C++:
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

template<class T>
class listea {

private:
    template<class T>
    struct element{
        listea<T>::element *previous;
        listea<T>::element *next;
        T val;
    };

    listea<T>::element *firstele;
    listea<T>::element *lastele;
    listea<T>::element *currentele;
    
public:
    listea(void);
};
listea.cpp
C++:
#include "listea.h"

template<class T>
listea<T>::listea(void) {
	this->firstele   = NULL;
	this->lastele    = NULL;
	this->currentele = NULL;
}

Und folgender Fehler wird erzeugt:
Code:
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall listea<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::listea<class std::basic_string<char,struct std::char_traits<char>,class
 std::allocator<char> > >(void)" (****0?$listea@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAE@XZ)
Debug/verkettete_listen.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.
 
Zuletzt bearbeitet:
Ich habe mich oben nur verschrieben das sollte listea.h heißen ;) Habs eben verbessert, sorry.

@MSVCplusplus nein wir schreiben keine Bibliothek..
 
Meines Wissens nach muss bei Template-Klassen und -Funktionen der Funktionskörper ebenfalls in die Header-Datei. Eine Trennung in *.h und *.cpp ist nicht möglich.
 
C++:
#include <fstream>
#include <string>
#include <iostream>
 
using namespace std;
 
template<class T>
class listea {
//...
    listea<T>::element *currentele;
    
public:
    listea(void)
        : firstele(NULL) // initialisierungsliste sollte im Konstruktor genommen werden...
        , lastele(NULL)
        , currentele(NULL)
    {}
};
 
Die "Kurzschreibweise" habe ich nur als "Optimierung" eingefügt, der Funktionskörper befindet sich so jedoch in der Header-Datei, wo er auch sein muss. Zudem geht es so bei mir ohne Probleme. Die cpp natürlich weg (wie ich und auch Jennesta gesagt haben).

Desweiteren:
  1. NIE ein "using namespace ***" in eine Header-Datei schreiben. Das macht das Namespace-Prinzip kaputt.
  2. Zeile 11 im Header entfernen. Die Angabe von "template ..." ist unnötig und hat zumindest beim GCC zu einem Fehler geführt.
 
Zurück