wake-up-neo.net

Leere spitze Klammern in der Vorlagendefinition

Diese Frage war beim Interview: Verursacht dieser Code KompilierungsLinkfehler und warum? - /

template <int T> void f();
template <> void f<0>() {}

void test() 
{
    f<1>();
}

Bitte erläutern Sie das Verhalten. Danke vielmals.

15
Netherwire
template<> void f<0>() {}

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

Dieser Code ist falsch und führt zu Verbindungsfehlern, da es keine Spezialisierung für f<1> gibt und die Vorlagenversion der Funktion nicht defined ist.

17
ForEveR

Es wird kompiliert (der gesamte Code ist grammatisch gültig), schlägt jedoch in der Verbindungsphase fehl.

Dies liegt daran, dass template <int T> void f(); deklariert ist, aber nicht definiert, die <0> Spezialisierung ist definiert, aber das macht Ihnen nichts aus, da Sie es nicht instanziieren.

Eigentlich wäre es möglich , dass die Spezialisierung <0> Syntaxfehler enthält und das Programm würde immer noch fehlerfrei kompiliert! Dies liegt daran, dass Vorlagen formal nur dann kompiliert werden, wenn sie verwendet werden. (Ich würde nicht erwarten, dass ein Kandidat während der Interviewbedingungen geistesgegenwärtig ist, um darauf hinzuweisen.)

5
Bathsheba

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. Wir nennen es aber 1, wodurch versucht wird, die generische Vorlage aufzurufen. Da der Linker jedoch keine Definition für die allgemeine Vorlage findet, zeigt das Programm einen Linker-Fehler an.

Lösung

template <int T> void f();
template <> void f<0>() {}
template <int T> void f() { }


void test() 
{
  f<1>();
}
0
TREMOR