Templates verstehen



  • Ich habe hier einen Code, der ein solches Konstrukt enthält:

    typedef typename container::template insert<item_type> insert
    

    Dabei ist container als Template-Parameter übergeben.

    Was tut dieser Code genau?

    Selsbt anch Lektüre von http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords bin ich noch recht planlos. Das ganze erscheint mir recht schwierig.



  • Hier wird ein Typ definiert, welcher anhand des Template-Parameters ermittelt wird.
    Bei einem nicht-template Code würde man einfach

    typedef container::insert<item_type> insert;
    

    schreiben, d.h. man kann einfach 'insert' als Typ benutzen ohne immer 'container::insert<item_type>' schreiben zu müssen.

    Damit aber der C++ Parser weiß, daß es sich bei 'container' um einen Typen handelt (und keinen Namensbereich), muß man noch 'typename' davorschreiben, s.a. typename.
    Und das 'template' wiederum ist erforderlich, weil 'insert' selbst wiederum als Template deklariert ist (ansonsten würde der Parser die '<' und '>'-Zeichen als Kleiner-als und Größer-als erkennen), s.a. template (wichtig ist bei beiden Links jeweils 'dependant name').


  • Mod

    typedef typename container::template insert<item_type> insert;
    

    Th69 schrieb:

    Damit aber der C++ Parser weiß, daß es sich bei 'container' um einen Typen handelt (und keinen Namensbereich), muß man noch 'typename' davorschreiben

    Die Kategorie von container kennt der Compiler selbstverständlich. Das ist entweder ein Templateparameter oder irgendetwas Anderes das durch unqualifiziertes Lookup bereits in der Templatedefinition auffindbar ist (in diesem konkretn Fall ist container offenbar ein Templateparameter oder ein davon abhängiger Typ, weil sonst das folgende template-Schlüsselwort nicht erforderlich wäre).

    Was an dieser Stelle noch nicht feststeht, ist, was das gesamte Konstrukt container::template insert<item_type> darstellt; es könnte ein Typ sein oder auch ein Ausdruck (wenn insert ein Funktions- oder Variablentemplate ist).

    Das template-Schlüsselwort vor insert bezieht sich hingegen nur auf das einzelne Token insert selbst: das könnte (wenn wir noch nicht wissen, was container ist) auch ein Ausdruck sein, und das folgende < Zeichen wäre dann einfach der Vergleichsoperator.


  • Mod

    Es gibt uebrigens ein Paper, das prinzipiell redundante Vorkommen von typename optional machen will. P0634. Das wuerde hier ebenfalls greifen.


Log in to reply