2014-05-21 8 views
8

Diese Frage war beim Interview: Führt dieser Code irgendwelche Kompilierungs-/Verknüpfungsfehler und warum so?Leere spitze Klammern in Template-Definition

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

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

Bitte um das Verhalten zu erklären. Danke vielmals.

+0

Verknüpfung Fehler, müssen Sie 'Vorlage Leere f() {}' – P0W

Antwort

11
template<> void f<0>() {} 

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

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

+0

Warum Anweisung in der Definition wurde übersprungen ? Ist das möglich? – Netherwire

+0

@Netherwire ja, da es Spezialisierung ist, 'template <>' Punkte, dass es volle Spezialisierung der Funktion ist. – ForEveR

+0

Vielen Dank, eine großartige Erklärung! – Netherwire

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.

soloution

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


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

Es wird kompilieren (der gesamte Code ist gültig grammatisch), sondern wird bei Streckenstufe scheitern.

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

Eigentlich ist es würde möglich sein, für die < 0> Spezialisierung Syntaxfehler enthalten und das Programm würde noch ohne Fehler kompilieren! Dies liegt daran, dass Vorlagen nur dann kompiliert werden, wenn sie verwendet werden. (Ich würde kein Kandidat erwarten, dass die Gegenwart des Geistes während des Interviews Bedingungen haben, darauf hinweisen.)

+0

"es wäre möglich, dass die Spezialisierung <0> Syntaxfehler enthält und das Programm trotzdem fehlerfrei kompiliert wird!" - stimmt, aber nur mit laxen Compilern. Andere Compiler werden das nicht haben. – ach

+0

Nein, es gehört zum Standard. – Bathsheba

+0

Ich würde argumentieren, dass selbst wenn das Teil des Standards ist, eine <0> Spezialisierung mit Syntaxfehlern nur _might_ kompilieren; es kann nicht garantiert werden. Wenn es einen zusätzlichen nicht übereinstimmenden '}' Syntaxfehler enthält, hat der Compiler möglicherweise Probleme festzustellen, wo die Funktionsdefinition enden sollte, was dazu führt, dass die Zeile falsch analysiert wird. – Variadicism

Verwandte Themen