Diese Frage war beim Interview: Führt dieser Code zu Kompilierungs- / Verknüpfungsfehlern und warum?
%Vor%Bitte erläutern Sie das Verhalten. Vielen Dank.
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.
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.)
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%