problem mit typedef



  • hallo.
    es geht um das folgende reduzierte beispiel:

    template<typename T>
    struct Base
    {
    	typedef T Type;
    };
    
    template<typename T>
    struct Derive : T
    {
    };
    
    template<typename T>
    struct Foo : Derive<Base<T> >
    {
    	Type Bar;
    };
    
    int main()
    {
    }
    

    http://ideone.com/9jPKsq

    es kompiliert nicht mit der meldung:

    prog.cpp:15:2: error: ‘Type’ does not name a type
      Type Bar;
      ^
    

    ich verstehe nicht wieso das nicht geht, es ist aber auch möglich dass es trivial ist und ich im moment vollkommen blind bin. kann mir bitte jemand auf die sprünge helfen?



  • In der Basis wird nicht nicht gesucht. Ist ein Klassiker.
    Du musst ihn explizit auffordern da zu suchen.
    EDIT: Kurz Weil: wegen dem Templateargument

    Eine Möglichkeit war glaube ich 'typename Base<T>::Type'



  • nur weil die klasse aus einem klassentemplate instanziiert wurde? dass das bei nicht-template-klassen geht solange der bezeichner nicht überdeckt wird war mir klar, dieser merkwürdige spezialfall ist mir jedoch neu. wie wird das begründet?





  • EDIT: zu spät


  • Mod

    In the definition of a class or class template, if a base class depends on a template-parameter, the base class scope is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member.

    wie wird das begründet?

    Es kann noch (explizite oder partielle) Spezialisierungen des Basisklassentemplates Derived geben, von denen der Compiler zum Zeitpunkt der Definition von Foo noch nichts weiß.
    Da könnte Type auch als ein statischer Member deklariert sein, und nicht einen Typen benennen!

    Außerdem: Wenn du direkt von einem Template-Parameter ableitest, kann man offensichtlich zum Zeitpunkt der Definition eines Klassentemplates nichts über die Basisklasse wissen.



  • ach man, wie offensichtlich es eigentlich ist... dennoch bin ich nicht darauf gekommen. danke für die hilfe.


Anmelden zum Antworten