Template Funktion auslagern



  • Hi, ich versuche gerade eine Template Funktion auszulagern.

    In der temp.cpp kommt die Fehlermeldung:
    expected unqualified-id

    In der main.cpp kommt:
    'tem' does not refer to a value

    tem.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 statt printf.



  • @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 nicht static, 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!


Anmelden zum Antworten