Template Funktion auslagern
-
Hi, ich versuche gerade eine Template Funktion auszulagern.
In der temp.cpp kommt die Fehlermeldung:
expected unqualified-idIn der main.cpp kommt:
'tem' does not refer to a valuetem.h:
#ifndef TEM_H #define TEM_H class tem { public: tem(); template <typename T> T berechnen (T Wert1, T Wert2); }; #endif // TEM_H
tem.cpp:
#include "tem.h" tem::tem() { } tem::template <typename T> T berechnen (T Wert1, T Wert2) { T Ergebnis; Ergebnis = Wert1 * Wert2; return Ergebnis; }
main.cpp:
#include"tem.h" #include <iostream> using namespace std; int main() { int iA = 2, iB = 3; float fA = 1.235, fB = 3.446; double dA = 23.5459874, dB = 0.1398452; printf("Ergebnis Integer: %i\n", tem.berechnen(iA, iB)); printf("Ergebnis Float: %f\n", tem.berechnen(fA, fB)); printf("Ergebnis Double: %d\n", tem.berechnen(dA, dB)); return 0; }
-
Anfängerregel: Templates werden im Header implementiert.
-
Die Header würde dann also so aussehen:
#ifndef TEM_H #define TEM_H class tem { public: tem(); template <typename T> T berechnen (T Wert1, T Wert2) { T Ergebnis; Ergebnis = Wert1 * Wert2; return Ergebnis; } }; #endif // TEM_H
Aber dann kommt immer noch: 'tem' does not refer to a value
Normalerweise muss ich doch sagen, welchen Datentyp eine Funktion zurückgibt.
Aber der ist ja bei Templates unterschiedlich.
-
@theAnfänger77
Du brauchst ein Objekt, auf dem du die Methode aufrufen kannst.... int main() { tem t; t.berechnen(...); }
Blöd gefragt:
Warum ist das eine Methode und keine freie Funktion? Das Ergebnis hängt nur von den übergebenen Parametern ab, das Objekt drumrum wird überhaupt nicht gebraucht.Und wenn du schon C++ machst:
Benutz´cout
stattprintf
.
-
@theAnfänger77 sagte in Template Funktion auslagern:
tem::template <typename T> T berechnen (T Wert1, T Wert2)
Die Qualifizierung der Klasse "tem" kommt nicht vor das template< sondern vor den eigentlichen Funktionsnamen
template <typename T> T **tem::**berechnen (T Wert1, T Wert2)
Kleiner Tipp: ich denke du bist zu früh in die Template-Programmierung reingehüpft. Festige erstmal dein Wissen im Umgang mit normalen Klassen und ihren Instanzen.
-
Die
berechnen
-Funktion ist ja auch nichtstatic
, daher benötigt man eine Instanz, um darauf zuzugreifen:tem t; cout << t.berechnen(iA, iB) << endl; // außerdem in C++ typisiert arbeiten (anstatt printf, scanf und Konsorten)
Für so eine Funktion würde jedoch die Implementierung als freie Funktion (also nicht innerhalb einer Klasse) am besten sein:
template <typename T> T berechnen (T wert1, T wert2) { T ergebnis = wert1 * wert2; return ergebnis; }
(lokale Variablen am besten mit Kleinbuchstaben anfangen, gegenüber Namensbereichen, Klassen, Template-Parametern etc.)
-
Die Frage ist auch noch, warum für eine Multiplikation eine extra-Funktion mit festgelegtem Return-Typ benützt wird. Sie ist dann nicht allgemeingültig, da das Ergebnis einer Multiplikation einen anderen Typ haben kann als die einzelnen Faktoren. Bei vector*vector = skalar wäre das zum Beispiel der Fall. In diesem Fall wäre es dann besser, auto statt T für den Returntyp und die Ergebnisvariable zu benutzen, außer man möchte den Returntyp wirklich festlegen.
-
Vielen Dank für die Antworten. Ich habe ja vergessen eine Instanz der Klasse tem zu erzeugen!