Come creo un'istanza esplicita di una funzione modello?


117

Ho una funzione modello con un argomento. Devo istanziare quella funzione senza chiamare quella funzione significa esplicitamente che devo istanziare.

Ho questa funzione:

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

Ho istanziato quella funzione in questo modo:

template int function_name<int>(int);

Ma ho ricevuto i seguenti errori:

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

Risposte:


182

[MODIFICA 2]: nota che c'era una certa confusione riguardo al codice nella domanda originale a causa di problemi di formattazione del codice. Vedi la risposta di AnthonyHatchkins per maggiori dettagli.

Se vuoi davvero istanziare (invece di specializzare o qualcosa del genere) la funzione, fai questo:

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

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

[EDIT] Sembra esserci (molta) confusione per quanto riguarda l'istanziazione e la specializzazione esplicite. Il codice che ho pubblicato sopra riguarda l' istanza esplicita . La sintassi per la specializzazione è diversa. Ecco la sintassi per la specializzazione:

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

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

Notare che le parentesi angolari dopo il modello!


3
che è istanziazione o specializzazione ?
Nawaz

5
Non vero. Puoi dire al compilatore di istanziare esplicitamente i modelli. Google per "istanziazione esplicita del modello C ++" per maggiori dettagli.
hrnt

8
@Nawaz: ti sbagli. Ovviamente è sempre il compilatore quello che istanzia, quella riga è una richiesta dal programmatore al compilatore per istanziare il modello. Se hai una copia dello standard C ++, leggi 14.7.2 Istanziazione esplicita
David Rodríguez - dribeas

16
Specializzazione significa che probabilmente stai cambiando la sua implementazione. Creazione di istanze significa semplicemente che lo stai assegnando a una particolare unità di compilazione, possibilmente per prendere il suo indirizzo univoco o renderlo disponibile come funzione di libreria o per ridurre il bloat.
CashCow

3
@hrnt: Penso che tu abbia ragione. @ Shot: ho appena notato che la sintassi non ha template<>forma. Quello che ha scritto è diverso dalla specializzazione . +1 per avermi insegnato questa nuova cosa. Sto rimuovendo il mio post. : D
Nawaz

20

Il tuo codice è corretto.

Il messaggio di errore riguarda un punto del codice che non hai citato qui.

Aggiornare:

Il codice originale era

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

ed era corretto.

Ma non era citato e quindi assomigliava a questo:

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

Genera il seguente errore

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

che è chiaramente diverso da quanto citato da OP.

In questa variante la seconda riga è ok ( <int>può essere omessa qui), ma la prima riga è difettosa. Il compilatore non può indovinare che Tè un parametro del modello.


Tecnicamente non era il suo codice, era la modifica di Bill :) Il codice originale è template int function_name( T a) { }etemplate int function_name(int);
hrnt

@hrnt Il codice originale non è stato formattato correttamente, ma era corretto. Se fossi Balaji, tornerei e accetterei la tua risposta se la ritiene utile, ma per me (e presumibilmente per chiunque altro) la tua risposta (pur essendo perfettamente giusta da sola) non risponde alla domanda.
Antony Hatchkins

@hrnt Hai ragione che il codice originale era così. Ma a causa dell'argomento del modello dedotto, funziona ancora. Devo essere d'accordo con Antony Hatchkins sul fatto che l'errore deriva dal codice che l'OP non ha citato, tuttavia penso che la tua risposta sia ancora utile per le persone che non conoscevano l'istanza esplicita.
mpark

Bene, prendimi per esempio. Ho cercato su Google questa pagina quando volevo aggiornare la mia conoscenza ben dimenticata sull'istanza esplicita e non mi ha aiutato molto. Quanto a me, non c'è confusione sulla sintassi. Ciò che può causare confusione
sull'istanza

@AntonyHatchkins Ah, vero, non ho guardato l'origine della domanda originale, ma solo come appariva sul mio schermo. Faccio +1 su questo e modifico la mia risposta originale per notare la confusione riguardo alla domanda originale.
hrnt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.