GCC Template Problem

8

Visual Studio kompiliert diesen Code, aber gcc lässt ihn nur ohne den Operator Template kompilieren. Mit dem Operator Vorlage gibt es die folgenden Fehler:

Zeile 29: Fehler: erwartet ';' vor "itrValue"

%Vor%     
Pieter 23.12.2008, 19:14
quelle

3 Antworten

16

GCC hat Recht, const_iterator ist ein Typ und eine Vorlage, die vom Template-Operator & lt; & lt; abhängig ist. Sie müssen dem Compiler mitteilen, dass es sich um einen Typ und nicht um eine Variable handelt:

%Vor%     
Pieter 23.12.2008 19:21
quelle
5

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.

    
quelle
4

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 Argument 42 verwendet wird. Es ist kein Vergleich mit operator> und operator< von other mit 42 und was folgt (was tatsächlich totaler Unsinn wäre).

    
Johannes Schaub - litb 23.12.2008 22:08
quelle

Tags und Links