Um die @Pieter-Antwort zu vervollständigen, die korrekt ist, gibt es weitere Informationen darüber, wie Vorlagen verarbeitet werden. Zunächst einmal werden Vorlagen nur dann kompiliert, wenn sie instanziiert werden. Wenn Sie die Vorlage für einen bestimmten Typ nicht instanziieren, wird der Code niemals kompiliert.
Wenn Sie nun eine Vorlage instanziieren, wird der Vorlagencode in zwei Schritten validiert. Zuerst wird das Template auf Korrektheit überprüft, unabhängig davon, was der Instanziierungstyp ist. Um es anhand eines einfacheren Beispiels zu überprüfen:
%Vor%Während der ersten Phase wird die Vorlage auf Syntaxkorrektheit geprüft, ohne zu berücksichtigen, was A wirklich ist. Zu diesem Zeitpunkt könnte die Syntax A :: type ein Typ mit dem Namen 'type' oder eine statische Variable mit demselben Namen sein.
%Vor%Im ersten Fall ist Typ tatsächlich ein Typ, im zweiten Fall nicht. Nun stellt der Standard fest, dass, wenn es sich wirklich um einen Typ handelt, der Programmierer der Vorlage angeben muss, um den Compiler mit der obigen Syntax zu informieren:
%Vor%Um die Verarbeitung abzuschließen, muss der Compiler nun überprüfen, dass der Vorlagencode nicht nur in sich korrekt ist, sondern auch, wenn er mit dem bestimmten Typ T instanziiert wird. Dies führt der Compiler während der zweiten Stufe der Validierung durch. Es wendet den Typ an und überprüft auf Fehler.
In Ihrem Fall ist es etwas kontroverser, da jeder (aber der Compiler) weiß, dass std :: list :: const_iterator ein Typ für jedes gegebene T ist. Nun, tut es nicht muss sein. Aus sprachlicher Sicht könnte ein Code eine Vorlagenspezialisierung für einen bestimmten Datentyp T bereitstellen, die sich von der allgemeinen Listenvorlage unterscheidet. Der Compiler kann nicht wissen, ob das so sein könnte.
Beachten Sie, dass es fürchterlich falsch wäre, eine Vorlage im std-Namespace mit etwas zu spezialisieren, das das Verhalten ändert, indem die Iteratortypen neu definiert werden. Aber der Compiler sieht den std-Namespace genauso wie jeden anderen Namespace und listet ihn wie jede andere Template-Klasse auf.
Ich denke, es lohnt sich, Sie über die anderen Eindeutigkeiten zu informieren. Für typename
habe ich bereits eine andere hier beantwortet.
Der andere ist eine Vorlage. Schau hier:
%Vor%Beachten Sie, wie wir beide Template- und Typname-Disambiguationen verwenden mussten. Der Typname sagte dem Compiler
Die Sache, auf die Sie zugreifen, heißt
::type
, ist in der Tat ein Typ. Machen Sie keine Multiplikation, was fälschlicherweise annehmen würde, dass::type
ein statischer Wert (Integer oder etwas) ist.
Die Vorlage sagte dem Compiler
other<42>
ist eine Vorlage, die mit dem Argument42
verwendet wird. Es ist kein Vergleich mitoperator>
undoperator<
vonother
mit42
und was folgt (was tatsächlich totaler Unsinn wäre).