Stack Template // Compiler meckert

  • Guten Tag,


    wir müssen ein Stack Template erstellen um damit dann Infix und Postfix Notationen umzuwandeln bzw auszurechenen.
    Nun habe ist der Stack so weit fertig, aber beim Testen meckert der Compiler rum, vielleicht kann mir jemand von euch behilflich sein und mir sagen, wo bzw was nicht passt da ich im Moment nicht aus der Compilermeldung schlau werde.



    Folgende Fehlermeldungen:
    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Stack<int>::~Stack<int>(void)" (??1?$Stack@H@@QAE@XZ)" in Funktion "_main".
    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Stack<int>:: Stack<int>(unsigned int)" (??0?$Stack@H@@QAE@I@Z)" in Funktion "_main".


    Gruß

  • Also wenn ich damals mit C++ einen LNK-Error hatte, lag es daran, dass ich noch eine oder mehrere Libs einbinden musste.


    C
    1. #pragma comment(lib, "user32.lib");


    bzw. bei Visual Studio


    Projekt - Projekt-Eigenschaften - Konfigurationseigenschaften - Linker - Eingabe - Zusätzliche Abhängigkeiten


    Dort einfach die Libs eintragen
    (bzw. auf den Pfeil und dann siehste auch eine Liste mit glaube ich allen Libs. Könntest du auch einfach kopieren und einfügen. Vermutlich nicht die schönste Variante )

  • Danke schonmal für den Vorschlag!


    Hab folgende Libs eingebunden



    Aber nach wie vor selben Fehler beim kompilieren :(
    Vielleicht noch wer ne andere Idee.


    Gruß

  • Er hat die Klasse doch selbst geschrieben. Warum sollte eins seiner Symbole dann in einer anderen Lib definiert sein?
    Außerdem sind top und max keine Konstanten also kann du sie ganz normal im Konstruktor initialisieren und musst sie nicht hinter die Argumentenliste schreiben.
    Du kannst übrigens auch boolsche Ausdrücke zurückgeben und nicht nur "true"/"false".


    Zur Lösung deines Problems:
    Du musst deine Methoden nicht im Source-, sondern im Header-File definieren.
    Ob du diese jetzt direkt unter die Deklaration in der Klasse schreibst oder als Out-Of-Line darunter ist egal.

  • Ok vielen danke der Erklärung, aber warum kann ich das eigentlich nicht Source File umsetzen ?
    Hab ein wenig geschaut im Internet und da gibts immer wieder solche Implementierungen die auch so vorgeschlagen werden.


    Ich muss zugeben das bei meiner letzten Übung auch schon das selbe Problem aufgetreten ist und ich das dann auch einfach in die .h geschrieben hab und dann hat es geklappt, da ich die Aufgabe aber mit einer Musterlösung abgeglichen hab und dort auch in .cpp und .h geteilt war, war ich eben stutzig.


    Gruß und Danke!

  • Das liegt an C++ und seinem Linker.
    Jede Funktion, Variable, Klasse, Methode, usw. wird in ein Obj-File kompiliert und hat dort ein Symbol. Aus diesen .obj-Dateien und den Symbolen macht der Linker die .exe.
    Deine Templates haben aber nur etwas mit der Syntax und dem Compiler zu tun, denn eine Klasse Stack< typename T > kennt der Linker nicht und braucht für T einen Datentyp. [EDIT\\ er kennt die schon, aber du kannst sie nicht verwenden, weil du eben einen Datentyp mit angeben musst.]
    Du musst die Klasse direkt in das Header-File schreiben, weil du sonst nach dem Kompilieren eine Klasse hast, die keinen festen Typ hat und diese Klasse wird zwar im Source-File definiert, aber wenn du dann eine Instanz mit dem Datentyp int erstellst, wird diese nicht gefunden, sondern nur das Symbol ohne festen Typ.


    MfG