Spezialisierung eines static-Funktiontemplates eines Klassentemplates



  • Ich hab hier ein kleines Problem mit der Template Syntax. Vielleicht ist das Konstrukt so auch gar nicht möglich. Vielleicht kann mir einer von euch sagen wo der Denkfehler ist oder wie die richtige Syntax aussieht.

    Hier mal ein vereinfachter Code:

    template<typename T>
    class BaseClass {
    void blubb() = 0;
    /*...*/
    public:
      template<unsigned int var>
      static BaseClass* Create();
    };
    

    Eine abgeleitete Klasse soll nun neben der Implementation eine spezialisierte Version von Create() für ein bestimmtes 'var' implementieren, welche ein Objekt der abgeleiteten Klasse erzeugt, castet und zurückgibt. Jetzt ist das Problem, wie sieht der genaue Syntax der spezialisierten Version aus?

    Mein erster Ansatz:

    template<typename T>
    inline BaseClass<T>* BaseClass<T>::Create<1>() {
    	return static_cast<BaseClass<T>*>(new DerivedClass<T>());
    }
    

    Compiler wirft aber Fehler.

    Ziel ist es mit einer Create-Funktion und dem wählbaren Templateparameter verschiedene Implemetationen der Basisklasse zu erzeugen, welche aber selbst ein Klassentemplate ist, was mich beim definieren der Funktion irgendwie verwirrt 😕

    Bin für jede Hilfe dankbar.



  • template<typename T>
    template<>
    inline BaseClass<T>* BaseClass<T>::Create<1>() {
       return static_cast<BaseClass<T>*>(new DerivedClass<T>());
    }
    

    (nur geraten, nicht ausprobiert)



  • Funktioniert leider nicht. Compiler bringt folgenden Fehler:
    "Unzulässige Verwendung von expliziten Vorlagenargumenten."

    Ich habs auch schon so probiert:

    template<>
    template<typename T>
    inline BaseClass<T>* BaseClass<T>::Create<1>() {
       return static_cast<BaseClass<T>*>(new DerivedClass<T>());
    }
    

    Dann erkennt er allerding die Funktion nicht mehr als Spezialisierung und mit bspw. so einem Aufruf:

    BaseClass<int>::Create<1>();
    

    will er die unspezialisierte Version aufrufen, was zu einem Linkerfehler führt.

    PS: Ich benutze übrigens MSVS2008


Log in to reply