Templatedeklaration



  • Ich versuche das Laufzeitverhalten eines Algorithmus mittels Templates zu verbessern.
    Dabei bin ich auf ein Verständnisproblem gestossen.
    Ich gebe hier mal ein kleines Beispiel:

    Ich möchte in main.cpp verschiedene templates (genau 2) von "tester" verwenden:

    #include <stdio.h>
    #include "test.h"
    
    void main()
    {
      templates t;
    
      printf_s("%d\n", t.tester<1, 0>());
      printf_s("%d\n", t.tester<0, 1>());
    }
    

    Die Header-Datei "test.h" sieht wie folgt aus:

    #ifndef MOVE_H_INCLUDED
    #define MOVE_H_INCLUDED
    
    class templates
    {
    public:
      template<int X, int Y>
      int tester() const;
    };
    
    #endif
    

    Es ist klar, dass der Linker die Funktionen
    "int templates::tester<1,0>(void) const"
    und
    "int templates::tester<0,1>(void) const"
    nicht finden kann.

    Das ist die Quelldatei "test.cpp":

    #include "test.h"
    
    template<int X, int Y>
    int templates::tester() const
    {
      return 2 * X + 3 * Y;
    }
    

    Aber wie muss ich die beiden Templates deklarieren?

    Sorry, habe das Prinzip wohl noch nicht ganz verstanden 🙄


  • Administrator

    FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html

    Allerdings wenn ich so Dinge wie printf_s oder <stdio.h> lese, frage ich mich, ob du nicht zuerst mal C++ lernen solltest?

    Grüssli



  • Mit Inline Funktionen klappt es. Aber mit externer Bindung noch nicht.

    #ifndef MOVE_H_INCLUDED
    #define MOVE_H_INCLUDED
    
    const int WHITE = 0;
    const int BLACK = 1;
    
    class templates
    {
    public:
      template<int M, int Y>
      int tester() const;
    };
    
    template<>
    inline int templates::tester<WHITE, BLACK>() const
    {
      return 2 * WHITE + 3 * BLACK;
    }
    
    template<>
    inline int templates::tester<BLACK, WHITE>() const
    {
      return 2 * BLACK + 3 * WHITE;
    }
    
    #endif
    
    #include <stdio.h>
    #include "move.h"
    
    void main()
    {
      templates t;
    
      printf_s("%d\n", t.tester<WHITE, BLACK>());
      printf_s("%d\n", t.tester<BLACK, WHITE>());
    }
    

    😕



  • Templateklassen/-funktionen müssen in der Header Datei implementiert werden.



  • Tomahawk schrieb:

    Mit Inline Funktionen klappt es. Aber mit externer Bindung noch nicht.

    Was ist denn nun genau das Problem? Wo dein Fehler vorhin lag, hast du verstanden?

    Tomahawk schrieb:

    Worin liegt denn der Vorteil von Streams für simple Konsolenanwendungen gegenüber files?

    Unter anderem Typsicherheit, automatische Speicherverwaltung (z.B. von std::fstream gegenüber FILE* ) und die Möglichkeit, mit Nicht-POD-Objekten zu arbeiten.

    Aber Dravere meinte wahrscheinlich primär, dass weder der Header <stdio.h> noch die Funktion printf_s() Bestandteile von C++ sind. Wenigstens <cstdio> solltest du verwenden. Die Deklaration void main() ist übrigens auch falsch und zwar schon seit immer. Korrekt wäre int main() , überaus tolerante Compiler ändern daran nichts.


Anmelden zum Antworten