Verweis auf nicht aufgelöstes externes Symbol



  • Halloo.

    Ich hab beim Compilieren ein paar Fehlermeldungen, wo ich nicht weiß, was ich damit anfangen soll.

    Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >(void)" (??0?Stack@V?Stack@V?basic_string@DU?char_traits@D@std@@V?char\_traits@D@std@@V?allocator@D@2@@std@@@@QAE@XZ)" in Funktion "_main".

    Die anderen sind auch so ähnlich.

    Hier mein Quellcode:

    //main
    
    #include "stack.h"
    #include <string>
    
    using namespace std;
    
    int main() {
    	try {
    		Stack<string> s;
    
    		string a = "A";
    		string b = "B";
    		string c = "C";
    		string d = "D";
    		string e = "E";
    
    		s.push(a);
    		s.push(b);
    		s.push(c);
    		s.push(d);
    		s.push(e);
    
    		for (int i = 0; i < 6; i++)
    		{
    
    			cout << s.pop() << endl;
    
    		}
    
    	}
    	catch (exception const& ex) 
    	{
    		cerr << "Exceptoin: " << ex.what() << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    
    #include "stack.h"
    
    //Konstruktor
    template <class T>
    Stack<T>::Stack() 
    {
    	numElems = 0;
    	size = 5;
    	elems = new T [size];
    }
    
    //Destruktor
    template <class T>
    Stack<T>::~Stack() 
    {
    	delete [] elems;
    }
    
    //push
    template <class T>
    void Stack<T>::push (T& x) 
    {
    	if (size <=numElems)
    	{
    		T* tmp = elems;
    		size *= 2;
    		elems = new T [size]
    
    		for (int i = 0; i < numElems; i++)
    		{
    			elems[i] = tmp[i];
    		}
    
    		delete [] tmp;
    	}
    
    	elems[numElems++] = x;
    }
    
    //pop
    template <class T>
    T Stack<T>::pop()
    {
    	if (numElems == 0)
    	{
    		cerr << "Stack leer!" << endl;
    		exit (1);
    	}
    
    	return elems[--numElems];
    }
    
    //isEmpty
    template <class T>
    bool Stack<T>::isEmpty() const
    {
    	if ( elems == NULL)
    	{
    		return true;
    	}
    	return false;
    }
    
    //isFull
    template <class T>
    bool Stack<T>::isFull() const 
    {
    	if (numElems < size) 
    	{
    		return true;
    	}
    	else 
    	{
    		return false;
    	}
    }
    
    #ifndef stack_h
    #define stack_h
    #include <iostream>
    #include <exception>
    
    using namespace std;
    
    template <class T>
    
    class Stack {
    
    public:
    	Stack();
    	~Stack();
    	void push(T &);
    	T pop();
    	bool isEmpty() const;
    	bool isFull() const;
    
    private:
    	int size, numElems;
    	T *elems;
    
    };
    
    #endif
    

    Nach 2 Stunden Fehlersuche, weiß ich nicht, wo ich weiter machen soll.
    Vielleicht hat jemand einen Rat?!
    Danke 🙂


  • Mod

    http://www.c-plusplus.net/forum/151578

    edit: Da ich den nächsten Fehler schon voraus sehe:
    Google: C++ Regel der großen Drei



  • Danke, 5. hat geholfen.

    Allerdings muss ich da nochmal nachfragen.
    Ich hatte mir ein Skript zur Hilfe genommen, wo die Template-Klassen im Header deklariert wurden, aber in einer cpp Datei implementiert wurden.

    Muss ich immer alles in den Header packen, oder funktioniert das auch "extern" in einer cpp?


  • Mod

    Es gibt einen einzigen exotischen Compiler, der externe Templatedefinitionen kennt. Wenn dein Script das anders macht, dann hast entweder du etwas an der Stelle falsch verstanden oder das Script ist vollkommen weltfremd. Eine halbwegs gängige Methode ist noch, die Templatedefinitionen in der Headerdatei per include einzubinden. Also ausnahmsweise mal eine Sorucedatei bei include anzugeben. In der Datei dürfen dann aber keine anderen Definitionen (mit externer Linkage) stehen!



  • Ok, vielen Dank für die Erklärung 🙂


Anmelden zum Antworten