Wann brauchen wir ein .template Konstrukt

8

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?

    
Prasoon Saurav 17.08.2010, 03:21
quelle

4 Antworten

14

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:

  1. entweder T::constant wird mit 3 verglichen und das boolesche Ergebnis wird zu einem Template-Argument für T::constant
  2. oder 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:

%Vor%

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.

    
Potatoswatter 17.08.2010, 23:56
quelle
7

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

    
Chubsdad 17.08.2010 05:08
quelle
0

Der Standard setzt voraus, dass die Schlüsselwörter template oder typename Dinge disambiguieren, die vom Vorlagenkontext abhängen .

    
Max Lybbert 17.08.2010 03:36
quelle
0

Das erste Beispiel kompiliert und läuft gut für mich in VS 2010.

    
Jesse Collins 17.08.2010 03:38
quelle

Tags und Links