2015-02-05 17 views

Odpowiedz

55

template <> void foo<int>(int& t); deklaruje specjalizację z szablonu, z potencjalnie innym ciele.

template void foo<int>(int& t); powoduje jednoznaczne utworzenie egzemplarza szablonu, ale nie wprowadza specjalizacji. Wymusza tylko utworzenie szablonu dla określonego typu.

+2

To jest dość mylące! Zakładam, że znaczenie deklaracji jest takie, że kompilator nie zaakceptuje utworzenia nieskreślonego szablonu jako kandydata, gdy nie zostanie znaleziona specjalistyczna definicja? – einpoklum

+2

Wyjaśniając to nieco więcej: pierwszy może być użyty w pliku nagłówkowym i mówi "' foo 'będzie miał inną treść niż' foo '"; jeśli kod w innym miejscu w programie wywołuje 'foo ()' ale nie podajesz ciała, wtedy powinieneś otrzymać błąd alink. –

+3

Drugi nie powinien być używany w pliku nagłówkowym; używanie go w jednym pliku .cpp zapewnia, że ​​treść 'foo ' (która używa szablonu 'foo ' do wygenerowania, chyba że masz również linię specjalizacji!) jest faktycznie przetwarzana (Jest to trochę jak * definiowanie * a nie - funkcja szablonu). Zwykle nie musisz tego robić, jak to się dzieje, gdy jakiś inny kod wywołuje 'foo ', ale możesz to zrobić [z kilku powodów] (http://stackoverflow.com/questions/2351148/explicit- tworzenie instancji-kiedy-jest-używane) –

12

z klasą/struct,

template <typename T> struct foo {}; 

Po to specjalność:

template <> struct foo<int>{}; 

Po wyraźna w stantiation:

template struct foo<int>; 
Powiązane problemy