Implemantionsfrage bei Element-Templates



  • Hallo!

    Ich habe eine Frage zur Implementation von Element-Templates.
    Die Klasse sieht wie folgt aus:

    namespace nsFoo
    {
    
    template<class classType>
    class Foo
    {
    private:
    public:
    
      Foo() {}
     ~Foo() {}
    
      // Element-Template
      template<class Element>
      classType * name(const Element &e);
    };
    }
    

    Wie implemetiere ich jetzt die Memberfunktion "name". Ich wollte Sie nich implizit inline implementieren aus Übersichtlichkeitsgründen, sondern die Implementation zu den übrigen Membern schreiben. Mein armer Kompiler versteht mich nicht (MS C++ Compiler 😎 und ich weiß nicht wie ich für ausdrücken soll.
    Folgendes dachte ich mir:

    namespace nsFoo
    {
    
    // Implementationsdetails
    template<class classType, class Element>
    classType * Foo<classType>::name<Element>(const Element &e)
    {
      // Code...
    }
    }
    

    Der Kompiler wirft folgende Fehler:

    Fehler	1	error C2768: 'nsFoot::Foo<classType>::name': Unzulässige Verwendung von expliziten Vorlagenargumenten	foo.h	88	
    Fehler	2	error C2768: 'nsFoot::Foo<classType>::name': Unzulässige Verwendung von expliziten Vorlagenargumenten	foo.h	88	
    Fehler	3	error C2244: 'nsFoot::Foo<classType>::name': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden	foo.h	88
    

    Hat hier vielleicht jemand eine Lösung?



  • namespace nsFoo
    {
    
    // Implementationsdetails
    template<class classType>
    template<class Element>
    classType * Foo<classType>::name<Element>(const Element &e)
    {
      // Code...
    }
    }
    

    Sollte so gehen.



  • LordJaxom schrieb:

    Sollte so gehen.

    Danke Das habe ich auch schon probiert. Dann erhalte ich den Fehler

    Fehler	1	error C2768: 'nsFoo::Foo<classType>::name': Unzulässige Verwendung von expliziten Vorlagenargumenten	foo.h	89
    

    Aus der Fehlerbeschreibung werde ich nicht schlau...


  • Mod

    die fehlerbeschreibung sagt es eigentlich schon: der compiler schreibt eben
    nsFoo::Foo<classType>::name
    und nicht
    nsFoo::Foo<classType>::name<Element>
    bei normalen template funktionen wiederholst du die parameter ja auch nicht 😉 - was wozu gehört ergibt sich ja schon durch das doppelte template
    folglich

    namespace nsFoo
    {
    
    // Implementationsdetails
    template<class classType>
    template<class Element>
    classType * Foo<classType>::name(const Element &e)
    {
      // Code...
    }
    }
    


  • camper schrieb:

    die fehlerbeschreibung sagt es eigentlich schon: der compiler schreibt eben
    nsFoo::Foo<classType>::name
    und nicht
    nsFoo::Foo<classType>::name<Element>
    bei normalen template funktionen wiederholst du die parameter ja auch nicht 😉 - was wozu gehört ergibt sich ja schon durch das doppelte template

    Jo, danke für das Entfernen des Bretts. 😉
    Da hätt' man ja auch selber drauf kommen können.


Log in to reply