Prob mit Template implementierung



  • Ich bin c++-anfänger und experimentiere gerade etwas mit templates herum und hab mir das folgende beispiel erstellt und übersetzt. Doch der VC++ gibt mir immer folgende meldung als antwort:
    main.obj : error LNK2019: Nicht aufgelöstes externes Symbol '"float __cdecl berechnung<float>(float,float)" (??berechnung@M@@YAMMM@Z)', verwiesen in Funktion '\_main' main.obj : error LNK2019: Nicht aufgelöstes externes Symbol '"int \_\_cdecl berechnung(int,int)" (??berechnung@H@@YAHHH@Z)', verwiesen in Funktion '_main'

    Was mache ich falsch??

    #include <iostream>
    
    using namespace std;
    
    #include "berechnung.h"
    
    int main(void)
    {
    	int a=15;
    	int b=20;
    
    	float fa=15.3f;
    	float fb=19.7f;
    
    	cout<<berechnung(a,b)<<endl;
    	cout<<berechnung(fa,fb)<<endl;
    
    	return(0);
    };
    
    template <class T>
    
    T berechnung(T wert1, T wert2)
    {
    	return(wert1*wert2);
    };
    
    template <class T>
    
    T berechnung(T wert1, T wert2);
    

    😕



  • achso:

    1. datei: main.cpp
    2. datei: berechnung.cpp
    3. datei: berechnung.h



  • Deine Templates werden nicht instanziert und fehlen beim Linken. Entweder du sorgst dafuer indem du die Definition der Templatefunktion in die .h Datei mitaufnimmst oder indem du fue alle notwendigen Datentypen explizit instanzierst.



  • Verlager mal deinen Funktions-Code für das template aus der Source-Datei in die
    Header-Datei

    mfg JJ



  • thx,

    aber wie funktioniert das mit dem instanzieren für alle notwendigen datentypen 😕



  • c++ opa schrieb:

    thx,

    aber wie funktioniert das mit dem instanzieren für alle notwendigen datentypen 😕

    Einfach ein

    template double berechnung<>(double wert1, double wert2);

    in die berechnung.cpp einfügen. Dies sorgt dafür, dass die Funktion berechnung für double instanziert wird.



  • in die <> sollte aber auch ein double kommen 😉



  • otze schrieb:

    in die <> sollte aber auch ein double kommen 😉

    Kann, muss aber nicht.


Anmelden zum Antworten