Frage zu Template



  • Wenn ich ein Template habe wie kann ich damit weiter machen. Also damit listen oder Parameter erstellen. Habe noch nie mit Template gearbeitet.



  • Hast Du ein konkretes Problem? Wenn ja, dann zeige es, ist ein wenig schwierig, da deine Frage sehr unklar ist.



  • Das kannst du im deinem C++ Buch nachlesen.



  • Ich weiss nicht was genau du damit meinst.
    Kleines Beispiel:

    template<class T>
    class MeineKlasse
    {
      T MeineVariable;
      public:
        void SetzteVariable(T& NeuerWert);
    };
    
    template<class T>
    void
    MeineKlasse::SetzteVariable(T& NeuerWert)
    {
      this->MeineVariable = NeuerWert;
    }
    

    MfG, EOutOfResources



  • ich hänge mich jetzt da mal dran, ist zwar nicht ganz korrekt, ich weiß, aber einen neuen Thread mit ähnlichem Titel zu erstellen fand ich auch nicht richtig.

    ich wollte zu Übung ein klassen-template schreiben, und zwar einen eigenen Vektor.
    die Headerdatei sieht wie folgt aus:

    template<class T>
    class Vektor
    {
    public:
    	Vektor();
    	Vektor(const Vektor&);
    
    	void push_back(T);
    	T& at(int);
    
    	friend std::ostream& operator<<(std::ostream&,const Vektor&);
    
    private:
    	int length;
    	T* list;
    };
    

    die zugehörigen implementierungen, hier der konstruktor:

    template<class T>
    Vektor<T>::Vektor()
    {
    	length = 0;
    	list = new T[length];
    }
    

    wenn ich ein neues objekt Vektor erstelle, kriege ich folgende Fehlermeldung:
    (z.b.

    vektor<int> neuerVektor;
    

    )

    "vektor<int>::Vektor()" referenced from: _main in main.o
    symbol(s) not found
    collect2: ID returned 1 exit status

    diese Meldung tritt doch auf, wenn Prototyp und implementierung nicht übereinstimmen. aber wie müsste man das in diesem fall formulieren?
    den gleichen error erhalte ich auch bei den Methoden.



  • Hyde++ schrieb:

    vektor<int> neuerVektor;
    

    Das sollte so heissen:

    Vektor<int> neuerVektor;
    


  • ja, das ist klar.
    ist auch richtig bei mir, habs nur falsch gepostet.



  • hast du in .h und .cpp getrennt? Wenn ja: FAQ und nach Template Artikel suchen 🙂 ansonsten Regel der 3 googeln (falls nicht bekannt).



  • Templates gehören typischerweise in den Header. Ich vermute dass dieser bei dir im cpp ist.



  • okay, danke.
    ich hab mir einen artikel nochmal durchgelesen und die implementierung in die .h datei verschoben. ist aber finde ich nicht ganz zufriedenstellend.
    im artikel ist noch eine andere methode angegeben, und zwar dass man noch eine zeile hinzufügt.

    The other solution is to leave the definition of the template function in the .cpp file and simply add the line template void foo<int>(); to that file:

    // File "foo.cpp"
     #include <iostream>
     #include "foo.h"
    
     template<typename T> void foo()
     {
       std::cout << "Here I am!\n";
     }
    
     template void foo<int>();
    

    aber mir ist nicht ganz klar, was ich in meinem fall hinufügen muss.

    template Vektor<int>();
    

    das funktioniert jedenfalls nicht.
    außerdem müsste ich ja diese zeile für jeden vorkommenden typ schreiben, oder?
    oder könnte man auch

    template void foo<>();
    

    schreiben?



  • template class Vektor<int>;
    

    Und ja, das müsstest du für jeden vorkommenden Typ schreiben. Eine Klassenvorlage ist keine Klasse - wenn du ihre Definition dem Compiler nicht da bekannt machen willst, wo er sie brauchen könnte, musst du die Klassen, die er braucht, halt an anderer Stelle aus ihr konkretisieren.


Anmelden zum Antworten