Linkererror bei Pushdownstack



  • Hallo,
    Das wird jetzt etwas umfangreicher, da ich ueberhaupt nicht weiss wo ich da noch nach Linkerfehler suchen soll. Ich wollte eine ganz einfache Implementierung eines Pushdownstacks, die auf einem Array basiert, schreiben, dazu hab ich eine Klasse stack_arrayImp in einer .h Datei deklariert und in einer .cpp Datei dann definiert:

    //	4.7 Pushdown-Stack 01 : Arrayimplemetierung, .h Datei
    
    template <class Item>
    class stack_arrayImp
    {
    private:
    	Item *s;
    	int N;
    
    public:
    	stack_arrayImp();
    	stack_arrayImp( int);
    	~stack_arrayImp();
    //	int empty() const;
    	void push( Item item);
    	Item pop();
    };
    
    //	4.7 Pushdown-Stack01 : Arrayimplementierung, .cpp Datei
    
    #include "stock.h"
    
    //	Konstruktor/Destruktor:
    template<class Item> 
    stack_arrayImp<Item>::stack_arrayImp<Item>()
    {}
    
    template<class Item> 
    stack_arrayImp<Item>::stack_arrayImp<Item>( int maxN)
    {
    	s = new Item[maxN];
    	N = 0;
    }
    
    template<class Item> 
    stack_arrayImp<Item>::~stack_arrayImp<Item>()
    {}
    
    //	Funktionen:
    /*template<class Item> 
    int stack_arrayImp<Item>::empty() const
    {
    	return N == 0;
    }
    */
    template<class Item> 
    void stack_arrayImp<Item>::push( Item item)
    {
    	s[N++] = item;
    }
    
    template<class Item> 
    Item stack_arrayImp<Item>::pop()
    {
    	return s[--N];
    }
    

    Beide hab ich dann zusammengefasst in stock.h Datei:

    #ifndef PUSHDOWN_STACK_ARRAY
    #define PUSHDOWN_STACK_ARRAY
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    using namespace std;
    
    #include "Pushdown-Stack.h"
    
    #endif
    

    ...um dann mit einer client.cpp den stack zu testen:

    #include "stock.h"
    
    int main( int argc, char** argv)
    {
    ...
    

    Tja mein Compiler (studio .net) compiliert das ganze, aber kann es nicht linken - warum?

    4.7 Pushdown Stack mit Arrayimplementierung fatal error LNK1120: 5 unresolved externals
    4.7 Pushdown Stack mit Arrayimplementierung error LNK2001: unresolved external symbol "public: __thiscall stack_arrayImp<int>::~stack_arrayImp<int>(void)" (??1?$stack_arrayImp@H@@QAE@XZ)
    4.7 Pushdown Stack mit Arrayimplementierung error LNK2001: unresolved external symbol "public: __thiscall stack_arrayImp<int>::stack_arrayImp<int>(int)" (??0?$stack_arrayImp@H@@$$FQAE@H@Z)
    4.7 Pushdown Stack mit Arrayimplementierung error LNK2001: unresolved external symbol "public: void __thiscall stack_arrayImp<int>::push(int)" (?push@?$stack_arrayImp@H@@$$FQAEXH@Z)
    4.7 Pushdown Stack mit Arrayimplementierung error LNK2001: unresolved external symbol "public: int __thiscall stack_arrayImp<int>::pop(void)" (?pop@?$stack_arrayImp@H@@$$FQAEHXZ)
    4.7 Pushdown Stack mit Arrayimplementierung error LNK2001: unresolved external symbol "public: __thiscall stack_arrayImp<int>::~stack_arrayImp<int>(void)" (??1?$stack_arrayImp@H@@$$FQAE@XZ)
    

    Ich denke ich habe auf jeden Fall genug Info gegeben, aber wie gesagt, ich weiss nicht wo da was falsch oder fehlerhaft deklariert ist, vielleicht kann mir jemand helfen, Danke.

    Dann hab ich noch eine zweite Frage und zwar zur Funktion empty und der const Deklarierung, wie muesste die denn lauten, wenn ich das Const deklarieren will und warum sollte die Const sein, ich hab nur gelesen, das man das so macht, aber warum und wie? (Vielleicht kann mir jemand die richtigen Deklarationen in der .cpp und .h Datei der Klasse fuer empty posten, Danke auch hierfuer)



  • Schieb den ganzen Template-Kram ins Headerfile, oder setz ein export davor - dh. wenn dein Compiler dies unterstützt:
    export template<class Item>
    stack_arrayImp<Item>::stack_arrayImp<Item>( int maxN) ...

    zu const.
    Damit sagst du nur, dass empty den stack_arrayImpl nicht ändert (keine Dinge einfügt oder löscht etc.). Ansonsten ist alles richtig.

    Grüße
    Fux





  • Danke und aber Moment mal?! heisst das dann dass ich alle "Definitionen in den Header schreiben" muss oder nur die die das template nutzen, bzw soll ich dann die ganze Klasse in eine .h Datei verfrachten oder sollte man da eine .cpp Datei draus machen?


Anmelden zum Antworten