Template Problem



  • Ich hab ein problem, ich versuch gerade ein kleines Test-Template zu schreiben,
    welches arrays ausgeben soll, sonst nix.
    Aber beim Compilieren (MSVC) bekomm ich die Fehlermeldung beim einbinden des Templates,
    das er ein nicht aufgelöstes externes Symbol hat.

    printarray.h:

    #include<iostream>
    using namespace std;
    
    template<class T> class PrintArray
    {
        T *m_array;
        int m_isize;
    public:
        void SetData(T *array, int size);
        void Output();
    
        PrintArray(T *array,int isize);
        PrintArray();
        virtual ~PrintArray();
    
    };
    

    printarray.cpp

    #include "stdafx.h"
    #include "PrintArray.h"
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    
    template<class T>
    PrintArray<T>::PrintArray()
    {
    
    }
    
    template<class T>
    PrintArray<T>::~PrintArray()
    {
    
    }
    template<class T>
    PrintArray<T>::PrintArray(T *array,int isize)
    {
        m_array = array;
        m_isize = isize;
    }
    template<class T> 
    void PrintArray<T>::SetData(T *array, int size)
    {
        m_array = array;
        m_isize = size;
    }
    
    template<class T> 
    void PrintArray<T>::Output()
    {
        for(int i =0;i < m_isize; i++)
            cout << m_array[i]<<endl;
    }
    

    Woran liegt diese Fehlermeldung ? Ist der Sourcecode korrekt, oder hab ich irgendwo
    einen Fehler gemacht?
    Die Funktions definitionen findet der MSVC auch nicht im Klassenmenü (Doppelklick geht net zur cpp datei).

    Kompilieren tut er die Klasse korrekt, erst das einbinden ergibt einen fehler:

    PrintArray<int> array;//fehler
    

    Devil



  • Templates können nur in die cpp Datei wenn sie mit extern angegeben werden. (War doch extern ?) das kann der Compiler nicht.

    Benenne mal die cpp in templ oder so um, und includiere sie am ende des Headers.

    Der Compiler muß das was in der cpp steht in jeder UE sehen können in der Du es verwendest.



  • templates kann man leider nicht in *.h und *.cpp aufteilen (bzw. kann schon, nur unterstuetzt das quasi kein Compiler -> Stichwort export)

    Du musst alles in eine Datei schreiben, bzw. die Trennung Interface - Implementation kannst du dir dadurch bewahren, dass du die Implementation mittels #include "deine_impl.inl" in die Header einbindest...

    Nimm aber nicht *.cpp fuer diese 'inline' Datei - denn dann kommst du mit den echten *.cpp (also Uebersetzungseinheiten) durcheinander...



  • ok, gut zu wissen 🙂
    Alles in die *.h zu hauen ist auch keine gute idee oder ?

    Habs jetzt mit ner *.tpl gelöst.

    Devil



  • Original erstellt von devil81:
    *Alles in die .h zu hauen ist auch keine gute idee oder ?

    Im Prinzip geht es natuerlich schon.

    Aber der Vorteil von einer extra Datei ist der, dass du wenn die Compiler export endlich gut unterstuetzen, nur noch schoen export schreiben musst und das #include wegnehmen - und schon hast du wieder eine saubere trennung (sofern man bei templates hier von sauber sprechen kann :))


Anmelden zum Antworten