Wie instanziiere ich eine Vorlagenfunktion explizit?

117

Ich habe eine Vorlagenfunktion mit einem Argument. Ich muss diese Funktion instanziieren, ohne diese Funktion aufzurufen, was bedeutet, dass ich explizit instanziieren muss.

Ich habe diese Funktion:

template <class T> int function_name(T a) {}

Ich habe diese Funktion folgendermaßen instanziiert:

template int function_name<int>(int);

Aber ich habe folgende Fehler bekommen:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
Balaji
quelle

Antworten:

182

[EDIT 2]: Beachten Sie, dass aufgrund von Problemen mit der Codeformatierung einige Verwirrung hinsichtlich des Codes in der ursprünglichen Frage bestand. Weitere Informationen finden Sie in der Antwort von AnthonyHatchkins.

Wenn Sie die Funktion wirklich instanziieren möchten (anstatt sich zu spezialisieren oder so), gehen Sie folgendermaßen vor:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[EDIT] Es scheint (viel) Verwirrung hinsichtlich der expliziten Instanziierung und Spezialisierung zu geben. Der Code, den ich oben gepostet habe, befasst sich mit der expliziten Instanziierung . Die Syntax für die Spezialisierung ist unterschiedlich. Hier ist die Syntax für die Spezialisierung:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Beachten Sie, dass spitze Klammern nach der Vorlage!

hrnt
quelle
3
das ist Instanziierung oder Spezialisierung ?
Nawaz
5
Nicht wahr. Sie können den Compiler anweisen, Vorlagen explizit zu instanziieren. Google für "C ++ explizite Vorlageninstanziierung" für weitere Details.
8.
8
@Nawaz: du liegst falsch. Natürlich ist es immer der Compiler, der instanziiert. Diese Zeile ist eine Anforderung des Programmierers an den Compiler, die Vorlage zu instanziieren. Wenn Sie eine Kopie des C ++ - Standards haben, lesen Sie 14.7.2 Explizite Instanziierung
David Rodríguez - Dribeas
16
Spezialisierung bedeutet, dass Sie wahrscheinlich die Implementierung ändern. Instanziierung bedeutet einfach, dass Sie es einer bestimmten Kompilierungseinheit zuweisen, möglicherweise um seine eindeutige Adresse zu übernehmen oder es als Bibliotheksfunktion verfügbar zu machen oder um das Aufblähen zu reduzieren.
CashCow
3
@hrnt: Ich denke, du hast recht. @Ashot: Mir ist gerade aufgefallen, dass die Syntax keine template<>Form hat. Was er geschrieben hat, unterscheidet sich von der Spezialisierung . +1 für das Unterrichten dieser neuen Sache. Ich entferne meinen Beitrag. : D
Nawaz
20

Ihr Code ist korrekt.

Die Fehlermeldung bezieht sich auf eine Stelle im Code, die Sie hier nicht zitiert haben.

Aktualisieren:

Ursprünglicher Code war

template <class T> int function_name(T a) {}
template int function_name<int>(int);

und es war richtig.

Aber es wurde nicht zitiert und sah so aus :

template int function_name(T a) {}
template int function_name(int);

Es wird der folgende Fehler generiert

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

Das unterscheidet sich deutlich von dem, was OP zitiert hat.

In dieser Variante ist die zweite Zeile in Ordnung ( <int>kann hier weggelassen werden), aber die erste Zeile ist fehlerhaft. Der Compiler kann nicht erraten, dass dies Tein Vorlagenparameter ist.

Antony Hatchkins
quelle
Technisch war es nicht sein Code, es war Bills Bearbeitung :) Der ursprüngliche Code ist template int function_name( T a) { }undtemplate int function_name(int);
hrnt
@hrnt Der Originalcode wurde nicht korrekt formatiert, war jedoch korrekt. Wenn ich Balaji wäre, würde ich zurückkehren und Ihre Antwort akzeptieren, wenn er es für nützlich hält, aber für mich (und vermutlich für jeden anderen) beantwortet Ihre Antwort (obwohl sie für sich genommen vollkommen richtig ist) die Frage nicht.
Antony Hatchkins
@hrnt Du hast Recht, dass der ursprüngliche Code so aussah. Aber aufgrund des abgeleiteten Vorlagenarguments funktioniert es immer noch. Ich muss Antony Hatchkins zustimmen, dass der Fehler auf Code zurückzuführen ist, den das OP nicht zitiert hat, aber ich denke, Ihre Antwort ist immer noch nützlich für Leute, die nichts über explizite Instanziierung wussten.
Park
Nimm mich zum Beispiel. Ich habe diese Seite gegoogelt, als ich mein vergessenes Wissen über explizite Instanziierung auffrischen wollte - und es hat mir nicht viel geholfen. Was mich betrifft, gibt es keine Verwirrung über die Syntax. Was Verwirrung über die explizite Instanziierung verursachen kann, ist ihre Verwendung
Antony Hatchkins
@AntonyHatchkins Ah, stimmt - ich habe mir nicht die Quelle der ursprünglichen Frage angesehen, sondern nur, wie sie auf meinem Bildschirm angezeigt wurde. Ich werde dies +1 und meine ursprüngliche Antwort ändern, um die Verwirrung bezüglich der ursprünglichen Frage festzustellen.
9.