Funktion in Template-Klasse



  • Moin moin!

    Ich habe in folgende Header:

    #ifndef __TRACE_H__
    #define __TRACE_H__
    
    //#include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <typename T1, typename T2>
    class trace
    {
    
    	int valnum;
    
    	vector<T1> xval;
    	vector<T2> yval;
    
    public:
    	int add_y(T2);
    	int add_xy(T1,T2);
    	T2 get_y(int);
    	// ...
    
    };
    
    #endif
    

    Und dazu in der Implementierungsdatei:

    #include "trace.h"
    
    template <typename T1, typename T2>
    int trace<T1,T2>::add_y(T2 y)
    {
    	xval.push_back(numval);
    	yval.push_back(T2);
    
    	numval++;
    
    return 0;
    }
    
    template <typename T1, typename T2>
    T2 trace<T1,T2>::get_y(int pos)
    {
    
    	return yval[pos];
    }
    
    template <typename T1, typename T2>
    int trace<T1,T2>::add_xy(T1,T2)
    {
    	xval.push_back(T1);
    	yval.push_back(T2);
    
    	numval++;
    }
    

    Wenn ich das nun in meine Programmierung einbinden möchte, bekomme ich folgende Fehlermeldung:

    "main.obj : error LNK2001: unresolved external symbol "public: int __thiscall trace<int,double>::add_xy(int,double)" (?add_xy@?$trace@HN@@QAEHHN@Z)
    Debug/TempScanG.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe."

    Daraus schließe ich mal, dass der Linker die Funktion aus der Template-Klasse nicht den aus der Implementierungsdatei zuordnen kann und deswegen die Funktion als nicht implementiert gilt! Vermute ich da richtig?
    Wenn ja, wie kann ich das ändern?
    Wenn nein, woran kann es liegen?

    MfG und THX

    BK



  • die implementierungen eines templates kommen mit in den header.



  • Hi!

    Aber doch nicht zwangsweise oder?
    Habe z.B. folgendes im Internet gefunden:

    template <typename T1, class T2, unsigned int Length, T2 Invalid>
    class ATemplate
    {
    private:
    T1 m_var;
    T2 m_arr[Length + 1];
    public:
    ATemplate(void) {m_arr[Length] = Invalid;}
    T1& Data(void) {return m_var;}
    T2& DataAt(unsigned int);
    };
    
    //Implementierung von DataAt
    template <typename T1, class T2, unsigned int Length, T2 Invalid>
    T2& ATemplate<T1, T2, Length, Invalid>::DataAt(unsigned int Index)
    {
    if (Index > Length) Index = Length;
    return m_arr[Index];
    }
    

    Da ist es doch auch ausgelagert.



  • 😕

    wieso, es steht doch in der gleichen datei?

    es geht um den header... die datei.

    es muss in der gleichen datei stehen, nicht in einer extra .cpp.

    salüt



  • elise schrieb:

    die implementierungen eines templates kommen mit in den header.

    einverstanden!



  • Morgen,

    alternativ, was ich nicht unerwaehnt lassen will, kannst du das in einer extra
    Datei implementieren und diese dann am Ende der Header-Datei includieren.

    mfg
    v R



  • itman schrieb:

    elise schrieb:

    die implementierungen eines templates kommen mit in den header.

    einverstanden!

    *lach*


Anmelden zum Antworten