Załóżmy mam oświadczył:"template <>" vs "template" bez nawiasów - jaka jest różnica?
template <typename T> void foo(T& t);
Teraz, jaka jest różnica między
template <> void foo<int>(int& t);
i
template void foo<int>(int& t);
semantycznie? A czy szablon bez nawiasów i szablon z pustymi nawiasami ma inną semantykę w innych kontekstach?
związane z: How do I force a particular instance of a C++ template to instantiate?
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
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. –
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) –