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.