Leere spitze Klammern in der Schablonendefinition

8

Diese Frage war beim Interview: Führt dieser Code zu Kompilierungs- / Verknüpfungsfehlern und warum?

%Vor%

Bitte erläutern Sie das Verhalten. Vielen Dank.

    
Netherwire 21.05.2014, 09:21
quelle

3 Antworten

11
%Vor%

ist Spezialisierung der Funktionsvorlage für das Argument 0 , wenn Sie f<0>() aufrufen, wird diese Version der Funktion aufgerufen.

Dieser Code ist falsch, er verursacht Verknüpfungsfehler, da es für f<1> keine Spezialisierung gibt und die Vorlagenversion der Funktion nicht defined ist.

    
ForEveR 21.05.2014, 09:22
quelle
3

Es wird kompiliert (der gesamte Code ist grafisch gültig), wird aber in der Link-Phase fehlschlagen.

Dies liegt daran, dass template <int T> void f(); deklariert ist, aber nicht definiert ist, das & lt; 0 & gt; Spezialisierung ist definiert, aber das macht keine Vorteile für Sie, da Sie es nicht instanziieren.

Eigentlich wäre für die & lt; 0 & gt; Spezialisierung, um Syntaxfehler zu enthalten und das Programm würde immer noch ohne Fehler kompilieren! Dies liegt daran, dass Vorlagen nur dann kompiliert werden, wenn sie verwendet werden. (Ich würde nicht erwarten, dass ein Kandidat die Geistesgegenwart während der Interviewbedingungen hat, um darauf hinzuweisen.)

    
Bathsheba 21.05.2014 09:28
quelle
0

Es wird kompiliert, da der Compiler eine Deklaration für eine generische Vorlage sehen kann. Es gibt auch eine voll spezialisierte Vorlage für 0. Aber wir nennen es für 1, die versuchen wird, die generische Vorlage aufzurufen, aber da der Linker keine Definition für die allgemeine Vorlage finden kann, wird das Programm Linker-Fehler anzeigen.

Solution

%Vor%     
TREMOR 21.05.2014 09:27
quelle

Tags und Links