Verzweiflung bei Templates



  • Herrmann schrieb:

    ...
    template <typename T> class Object
    {
      public:
        SL_Item();  // ? meintest du nicht Object()
        ~SL_Item();  // ?
    }
    ...
    

    anscheinend findet der Linker den ctor nicht fuer die Object Klasse, ich selbst programmiere eigentlich die Funktionen direkt in der .h datei aus, dann ersparrt man sich solche Sachen und der Linker findet den ctor (die Member-Funktionen) bestimmt



  • Beispielcode korrigiert. Ich habe nur etwas dageben andere Dinge als die Klassenbeschreibung in .h/.hpp-Dateien zu schreiben. Ich verstehe nicht was ich falsch mache.



  • Tja, dann hast du ein Problem und musst wohl auf Templates verzichten.



  • Dir bleibt nichts anderes ueber als auf Header oder Header + Includefile zurueckzugreifen. Eine .cc brauchst du nicht, ausser wenn du z.B. static Member hast, aber die Funktionen gehoeren in ein Includefile



  • Herrmann schrieb:

    Beispielcode korrigiert. Ich habe nur etwas dageben andere Dinge als die Klassenbeschreibung in .h/.hpp-Dateien zu schreiben. Ich verstehe nicht was ich falsch mache.

    Es gibt durchaus C++ Compiler, die mit template-Definitionen (also z.B. Funktionsdefinitionen) in .cpp-Dateien zurechtkommen. Allerdings erfordert das spezielle Compiler und Linker, wie z.B. bei IBM VisualAge for C++. Leider ist der Compiler fuer den PC-Sektor eingestampft worden. Meines Wissens gibt's ihn noch fuer Server, ist aber sehr teuer. Es gibt auch andere alternative C++ Compiler, die kosten aber richtig Geld, so im fuenf- bis sechsstelligen Bereich pro Lizenz.

    Bei den "Brot- und Butter-" C++ Compilern der PC-Welt gibt's sowas nicht, da kann man froh sein, wenn man einen Optimizer bekommt (z.B. GCC hat einen, ist eh kostenlos, aber VC++ hat nur einen Optimizer in der teuren Pro Edition).

    Zurueck zu den Templates: Das genannte Verfahren erfordert einen Zwischen-Link-Schritt, bei dem der Compiler einen sog. "Intermediate Code Linker" aufruft, bevor die 2. Phase der Compilierung (die Code-Generierung) ausgefuehrt wird.

    Deshalb, bei den ueblichen Schrott-Compilern im PC-Bereich am besten den Inhalt der .cpp-Datei in die .h-Datei kopieren, und fertig, auch wenn's eigentlich nicht sauber programmiert ist (man macht ja die Funktionen dadurch im Prinzip zu inline-Funktionen). Die Simpel-Versionen der STL machen's allerdings genauso, deswegen kannste's ruhig auch so machen.

    Hinweis noch zur Verwendung von "namespace": Die namespace-Deklaration ums Include-Statement zu machen kann auch nicht jeder Compiler, am besten ist, Du machst die namespace-Deklaration im Header-File.



  • @power off

    ich würd dir nur gern die lektüre des schlüsselworts "export" in verbindung mit templates empfehlen. kann zwar nur ein compiler, aber der preis liegt bei dem nur im 2stelligen dollar bereich.

    btw: ohne export darf kein compiler damit zurechtkommen.

    Die Simpel-Versionen der STL machen's allerdings genauso, deswegen kannste's ruhig auch so machen.

    die nicht simpel versionen includen am ende eine weitere datei die die implementation enthält(sofern kein export unterstützt wird), ist das im endeffekt soviel anders?

    Hinweis noch zur Verwendung von "namespace": Die namespace-Deklaration ums Include-Statement zu machen kann auch nicht jeder Compiler, am besten ist, Du machst die namespace-Deklaration im Header-File.

    irr ich mich, oder MUSS das nicht jeder compiler können, da der preprozessor den include durchführt, bevor der compiler den code selber überhaupt sieht?



  • otze schrieb:

    @power off

    ich würd dir nur gern die lektüre des schlüsselworts "export" in verbindung mit templates empfehlen. kann zwar nur ein compiler, aber der preis liegt bei dem nur im 2stelligen dollar bereich.

    Welcher Compiler ist das?

    otze schrieb:

    btw: ohne export darf kein compiler damit zurechtkommen.

    Irrtum:

    ISO/IEC 14882:2003, section 14, paragraph 6 schrieb:

    A namespace-scope declaration or definition of a non-inline function template, a non-inline member function template, a non-inline member function of a class template or a static data member of a class template may be preceded by the export keyword.

    Man bemerke das "may", d.h. "darf".

    Also, "export" darf verwendet werden, um non-inline Code als Export zu kennzeichnet. Das heisst keineswegs, dass es so sein muss.

    Bei VisualAge C++ war das eh irrelevant, da der heutige C++ Standard damals noch nicht existierte. Es gab bei dem Compiler mehrere Methoden, Template Code auszulagern. Z.B. in einem speziellen Verzeichnis, das man beim Compilieren dem Compiler bekannt machte. Alle Template-Instanzen wurden vom Intermediate-Code-Linker dann automatisch gefunden.

    otze schrieb:

    die nicht simpel versionen includen am ende eine weitere datei die die implementation enthält(sofern kein export unterstützt wird), ist das im endeffekt soviel anders?

    Ein Include der Funktionsdefinitionen laeuft im Prinzip auf das Gleiche hinaus.

    Rest siehe oben.

    otze schrieb:

    irr ich mich, oder MUSS das nicht jeder compiler können, da der preprozessor den include durchführt, bevor der compiler den code selber überhaupt sieht?

    Korrekt. Sind halt Compiler-Bugs. Wenn's geht, ist gut.



  • Welcher Compiler ist das?

    Comeau



  • otze schrieb:

    Comeau

    Danke!! 🙂 👍



  • Danke für die Antworten, habt mir damit schon sehr geholfen. Habe jetzt die komplette Klassenimplementierung in die Header-Datei gepackt. Werde mich mit dem Thema wohl noch etwas beschäftigen.



  • SnorreDev schrieb:

    Eine .cc brauchst du nicht, ausser wenn du z.B. static Member hast

    Afaik nicht mal dann.

    Power Off schrieb:

    Bei den "Brot- und Butter-" C++ Compilern der PC-Welt gibt's sowas nicht, da kann man froh sein, wenn man einen Optimizer bekommt (z.B. GCC hat einen, ist eh kostenlos, aber VC++ hat nur einen Optimizer in der teuren Pro Edition).

    The one and only Optimizer gibts nur hier. 😃
    Aber selbst MS stellt seinen Optimizing Compiler mittlerweile frei zur Verfügung.


Anmelden zum Antworten