2015-02-05 14 views

risposta

55

template <> void foo<int>(int& t); dichiara un specializzazione del modello, con il corpo potenzialmente diverso.

template void foo<int>(int& t); causa una istanziazione esplicita del modello, ma non introduce una specializzazione. Implica semplicemente l'istanziazione del modello per un tipo specifico.

+2

Questo è abbastanza confuso! Suppongo che il significato della dichiarazione sia che il compilatore non accetterà l'istanza del modello non specialistico come candidato, quando la definizione specializzata non viene trovata? – einpoklum

+2

Spiegando questo un po 'di più: il primo può essere usato in un file di intestazione e dice "' pippo ' avrà un corpo diverso da 'pippo ' "; se il codice altrove nel programma chiama 'foo ()' ma non fornisci il corpo, allora dovresti ottenere l'errore di alink. –

+3

Il secondo non deve essere utilizzato in un file di intestazione; usandolo in un file .cpp si assicura che il corpo di 'foo ' (che usa il modello 'foo ' per generarlo a meno che non si abbia anche la linea di specializzazione!) sia effettivamente processato (È un po 'come * definire * un non funzione -template). Normalmente non è necessario farlo come succede ogni volta che qualche altro codice chiama 'foo ', ma si potrebbe voler farlo [per alcuni motivi] (http://stackoverflow.com/questions/2351148/explicit- istanziazione-quando-è-usata) –

12

Con classe/struttura,

template <typename T> struct foo {}; 

seguito è una specializzazione:

template <> struct foo<int>{}; 

seguito è un esplicito stantiation:

template struct foo<int>; 
Problemi correlati