Supponiamo che ho dichiarato:"modello <>" vs "modello" senza parentesi: qual è la differenza?
template <typename T> void foo(T& t);
Ora, qual è la differenza tra
template <> void foo<int>(int& t);
e
template void foo<int>(int& t);
semanticamente? E template-with-no-parentesi e template-with-empty-parentesi hanno altre semantiche in altri contesti?
relativi a: How do I force a particular instance of a C++ template to instantiate?
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
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. –
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) –