Statische Instanz einer Template Klasse in der Template Klasse



  • Hallo zusammen,

    In C++ kann man ja statische Instanzen einer Klasse selber erstellen.

    //Foo.h
    class Foo
    {
    public:
        static Foo foo;
    };
    
    //Foo.cpp
    Foo Foo::foo;
    

    Nun habe ich jedoch eine Template-Klasse von der ich eine statische Instanz brauche:

    //Foo.h
    template<typename T> class Foo
    {
    public:
        static Foo<T> foo;
    };
    
    //Foo.cpp
    template class Foo<int>;
    //... weitere
    

    Doch wie definiere ich jetzt den statischen Member?
    Und es wäre schön, wenn es auch eine Möglichkeit gäbe den ebenfalls in foo.cpp zu definieren. 😃
    Auf Antwort hoffend,
    Qwerty



  • //Foo.h 
    template<typename T> class Foo 
    { 
    public: 
        static Foo<T> foo; 
    }; 
    
    //Foo.cpp 
    template<typename T>
    Foo<T> Foo<T>::foo()
    {
    }
    


  • template< typename T >
    Foo<T> Foo<T>::foo;



  • Ja, daran hatte ich auch zuerst gedacht.
    Entwender ich mache einen Zugriffsfehler oder bin einfach nur blöd...
    Wenn ich versuche in main so darauf zuzugreifen:

    Foo<int>::foo.bar();
    

    Meckert der Compiler, dass er Foo<int>::foo nicht kennt.
    Schreibe ich das in die Headerdatei, meckert er, dass er die Funktion nicht kennt.
    Erzeuge ich ganz normal ein Objekt:

    Foo<int> foo;
    foo.bar();
    

    Ist alles in Ordnung.
    Was mache ich falsch?
    Qwerty123



  • soweit ich das jetzt beurteilen konnte, greifst du auf die falsche Ebene zu.
    Wenn ich ein template x<T> habe muss ich doch zangsläufig immer

    x<T>::WhatEver
    

    schreiben.

    Wenn du das mit einem statischen Member schachtelst, müsstest du also

    x<T>::myX<T>
    

    schreiben.

    Zumal warscheinlich hier noch das Problem hinzukommt, dass dein Member (warum auch immer) static ist. Wenn du dem Compiler jetzt sagst ich will den Member ansprechen wird dieser nicht wissen welchen Typ er braucht. Ich kan zwar sagen

    Foo<int>::foo
    

    foo kann aber vorher schon mit irgendwas anderem definiert worden sein und so aussehen

    Foo<int>::foo<float>
    

    von daher ist das Konstrukt an sich schon ziemlich inkonsistent.


Anmelden zum Antworten