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; }; #endifEs 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

-
FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html
Allerdings wenn ich so Dinge wie
printf_soder<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::fstreamgegenüberFILE*) und die Möglichkeit, mit Nicht-POD-Objekten zu arbeiten.Aber Dravere meinte wahrscheinlich primär, dass weder der Header
<stdio.h>noch die Funktionprintf_s()Bestandteile von C++ sind. Wenigstens<cstdio>solltest du verwenden. Die Deklarationvoid main()ist übrigens auch falsch und zwar schon seit immer. Korrekt wäreint main(), überaus tolerante Compiler ändern daran nichts.