Nested-Classes in Template-Klassen -> Vererebung



  • Hallo ich habe eine Template-Klasse, welche eine innere Klasse hat.
    Von dieser Template Klasse leite ich eine andere Template Klasse ab:

    [code]
    template <class T>
    class Basis
    {
    public: 
          class Nested
          {
          public:
              T data;
              Nested(){}
              ~Nested(){}                 
          }; 
          T foo;    
          Nested elem; 
          Basis(){}
          ~Basis(){}
    };
    
    template <class T>
    class Abgeleitet: public Basis<T>
    {
    public:
          typename Basis<T>::Nested elem;
          Abgeleitet(){}
          void dowhat(T var)
          {
               elem.data = var;
               this->foo = var;       
               this->elem.data = var;     
          }
          ~Abgeleitet(){}   
    };
    [/code]
    

    So, nun habe ich 2 Fragen:

    1. Wofür ist das typename da, warum geht das nicht ohne?
    2. Warum muss ich in Abgeleitet this-> benutzen, warum geht das auch nicht ohne?

    Danke, derni



  • derni schrieb:

    1. Wofür ist das typename da, warum geht das nicht ohne?

    Das typename sagt dem Compiler, dass es sich bei dem vom Templateparameter T abängigen Namen Nested um einen Typ handelt. Ohne das typename würde der Compiler davon ausgehen, dass Nested ein Element von Basis ist und dessen Wert bestimmen.
    Die Sprache ist hier nämlich mehrdeutig. Zumindest solange du nicht weißt, was genau T ist.

    Weiterführende Informationen findest du unter dem Stichwort "dependent names" in jedem guten C++ Buch.

    2. Warum muss ich in Abgeleitet this-> benutzen, warum geht das auch nicht ohne?

    Wegen 14.6.2/3. Die dortige Regel sagt, dass der Scope einer Basisklasse nicht bei Namenslookup nicht automatisch berücksichtigt wird, falls die Basisklasse von einem Templateparameter abhängig ist. Solche Namen werden nur sichtbar, wenn du sie qualifizierst (z.B. mit this-> oder mit Base<T>::) und damit dem Compiler mitteilst, dass es sich bei diesen Namen um abhängige Namen handelt.

    Wiedrerum findest du weiterführende Informationen unter dem bereits genannten Stichwort "dependent names".



  • Danke!



  • derni schrieb:

    typename Basis<T>::Nested elem;

    Ist das erlaubt???



  • Weis.NET schrieb:

    derni schrieb:

    typename Basis<T>::Nested elem;

    Ist das erlaubt???

    Generell: Ja ist es, aber was daran stört dich?



  • Das man einem Objekt und einer Klasse den selben Namen gibt



  • Weis.NET schrieb:

    Das man einem Objekt und einer Klasse den selben Namen gibt

    wo ist hierbei deiner meinung nach das objekt, und wo die klasse?



  • derni schrieb:

    [code]  
          Nested elem;  //Objekt
          ...
          typename Basis<T>::Nested elem; //KLasse
    [/code]
    


  • Weis.NET schrieb:

    derni schrieb:

    [code]  
          Nested elem;  //Objekt
          ...
          typename Basis<T>::Nested elem; //KLasse
    [/code]
    

    Wo siehtst du da die Klasse? elem ist in beiden Fällen in Objekt.

    das typename bezieht sich auf Nested, damit klar ist, dass Nested ein Typname und kein Objekt ist.



  • Wieso denn das?

    Basis::Nested wird elem genannt (das macht das typedef), aber Nested ist eine Klasse, während Nested elem besagt: lege eine Instanz der Klasse Nested an, also ein Objekt.

    Somit gibts in Abgeleitet elem als Objekt und als Typedef für eine KLasse.



  • Wo siehst du denn da ein typedef?



  • ums ganz klar zu machen: typename ist ungleich typedef!
    name != def


Log in to reply