Ich habe das folgende Programm gemacht
%Vor% Das obige Programm wird nicht kompiliert, weil display()
eine Template-Member-Funktion ist, daher muss eine Qualifikation von .template
vor display()
gemacht werden. Habe ich Recht?
Aber wenn ich das folgende Programm gemacht habe
%Vor% Warum k.func<char>(k);
wird nicht kompiliert, selbst nachdem ein .template
Konstrukt angegeben wurde?
Das Symbol% co_de% bedeutet sowohl "kleiner als" als auch "Beginne Vorlagenargumente". Um zwischen diesen beiden Bedeutungen zu unterscheiden, muss der Parser wissen, ob der vorangehende Bezeichner eine Vorlage benennt oder nicht.
Betrachten Sie zum Beispiel den Code
%Vor% Entweder <
oder T::variable
muss eine Vorlage sein. Die Funktion bedeutet verschiedene Dinge, je nachdem, was ist und was nicht:
T::constant
wird mit 3 verglichen und das boolesche Ergebnis wird zu einem Template-Argument für T::constant
T::variable<>
wird mit T::constant<3>
verglichen. Um zu disambiguieren, ist das x->variable
Schlüsselwort vor entweder template
oder variable
erforderlich. Fall 1:
Fall 2:
%Vor%Es wäre nett, wenn das Schlüsselwort nur in wirklich mehrdeutigen Situationen (die selten sind) benötigt wird, aber es macht den Parser viel einfacher zu schreiben und verhindert, dass solche Probleme Sie überraschen.
>Für Standardens siehe 14.2 / 4:
Wenn der Name einer Mitgliedervorlage Spezialisierung erscheint nach. oder - & gt; in einem Postfix-Ausdruck oder danach nested-name-specifier in a qualifizierte ID und die postfix-expression oder qualifizierte-id hängt explizit von a ab Template-Parameter (14.6.2), der Der Name der Mitgliedsvorlage muss das Präfix haben durch die Keyword-Vorlage. Ansonsten der Name wird angenommen, um a zu benennen Nicht-Vorlage.
Abschnitt 5.1 von C ++ - Vorlagen erläutert dieses Konstrukt im Detail
Die folgende Funktion hat ein Problem
%Vor%Hier T = char und U = int
%Vor%wird aufgerufen. Eine solche Funktion existiert jedoch nicht
Obwohl unter normalen Umständen 'char' in 'int' konvertiert werden kann, gilt dies nicht für explizit angegebene Vorlagenargumente
Der Standard setzt voraus, dass die Schlüsselwörter template
oder typename
Dinge disambiguieren, die vom Vorlagenkontext abhängen .
Das erste Beispiel kompiliert und läuft gut für mich in VS 2010.
Tags und Links c++ templates member-functions