typedef in template-class



  • hola leute

    ich hab eine template-klasse, in welcher ich grundsaetzliche typdefs habe die fuer alle moeglichen template-parameter vorhanden und gleich sein sollen, sprich sie sind unabhaengig vom template parameter.

    template<class T>
    class my_class
    {
       public:
          typedef int my_int;
    };
    

    nun will ich folgendes schreiben koennen:

    my_class<my_class::my_int> value;
    

    was aber klaererweise nicht funktioniert, weil ich dem template-paramaeter my_class auch wiederrum einen parameter uebergeben muesste.

    ich koennte zwar meine typedefs in eine basisklasse legen und die template-klasse davon erben lassen, dann wuerde es aber ungefaehr so aussehen:

    my_class<my_basic_class::my_int> value;
    

    was ich aber auch nicht will.

    gibt es dafuer ne loesung ?

    Meep Meep



  • Zunächst obligatorisch der Hinweis: Es handelt sich dabei nicht um eine Template-Klasse, sondern um eine Klassen-Template bzw. Klassenvorlage. In deinem Beispiel ist my_class keine Klasse, sondern eine Vorlage, aus der Klassen erstellt werden können. myclass<int> ist eine Klasse.

    Du kannst aus my_class nicht einfach ohne Konkretisierung irgendein Symbol herausnehmen, weil dieses nicht eindeutig definiert sein muss. Einfaches Beispiel:

    template<typename T> struct foo { typedef T type; };
    

    ...welcher Typ sollte jetzt durch foo::type bezeichnet werden?

    Dazu kommt die Möglichkeit von Spezialisierungen, beispielsweise

    template<typename T> struct foo { typedef int type; };
    template<> struct foo<double> { int type; };
    

    ...was sollte foo::type jetzt sein?

    Dein Vorhaben ist also so nicht durchführbar. Du kannst eine Template nicht mit etwas konkretisieren, das du erst kennst, wenn du die konkrete Klasse hast -- es ist wie mit der Kiste, in der die Brechstange liegt, mit der man die Kiste aufbrechen könnte. Du musst die Brechstange irgendwo außerhalb der Kiste aufbewahren.



  • Äh?

    typedef int my_int;
    template<class T>
    class my_class
    {
       public:
    };
    

    Wenn es unbedingt sein muss, schreib doch my_class<my_class<void *>::my_int> oder so etwas.



  • Auf

    template<typename T = void*>
    struct my_class {
      typedef int my_int;
    };
    
    my_class<my_class<>::my_int> foo;
    

    könnte man den Compiler womöglich runterhandeln. In Templates dann

    my_class<typename my_class<>::my_int> foo;
    

    Richtig hübsch wird das so oder so nicht.



  • seldon schrieb:

    Beispiel:

    template<typename T> struct foo { typedef T type; };
    

    ...welcher Typ sollte jetzt durch foo::type bezeichnet werden?

    aus dem grund schrieb ich ja

    sprich sie sind unabhaengig vom template parameter.

    dachte halt das es dafuer vielleicht ne moeglichkjeit gibt

    Meep Meep


Anmelden zum Antworten