c++ templates template-specialization

c++ - "Plantilla<>" vs "plantilla" sin corchetes: ¿cuál es la diferencia?



templates template-specialization (2)

Supongamos que he declarado:

template <typename T> void foo(T& t);

Ahora, ¿cuál es la diferencia entre

template <> void foo<int>(int& t);

y

template void foo<int>(int& t);

semánticamente? ¿Y las plantillas sin corchetes y las plantillas con corchetes vacíos tienen otra semántica en otros contextos?

Relacionado con: ¿Cómo fuerzo una instancia particular de una plantilla de C ++ para crear una instancia?


Con clase / estructura,

template <typename T> struct foo {};

La siguiente es una especialización:

template <> struct foo<int>{};

Lo siguiente es una instanciación explícita:

template struct foo<int>;


template <> void foo<int>(int& t); declara una especialización de la plantilla, con un cuerpo potencialmente diferente.

template void foo<int>(int& t); provoca una instanciación explícita de la plantilla, pero no introduce una especialización. Simplemente fuerza la creación de instancias de la plantilla para un tipo específico.