¿Cómo puedo crear una instancia explícita de una función de plantilla?


117

Tengo una función de plantilla con un argumento. Tengo que instanciar esa función sin llamar a esa función significa explícitamente que tengo que instanciar.

Tengo esta función:

template <class T> int function_name(T a) {}

Instalé esa función así:

template int function_name<int>(int);

Pero tengo los siguientes errores:

error: expected primary-expression before 'template'
error: expected `;' before 'template'

Respuestas:


182

[EDICIÓN 2]: Tenga en cuenta que hubo cierta confusión con respecto al código en la pregunta original debido a problemas de formato del código. Consulte la respuesta de AnthonyHatchkins para obtener más detalles.

Si realmente desea instanciar (en lugar de especializar o algo así) la función, haga esto:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[EDITAR] Parece haber (mucha) confusión con respecto a la instanciación explícita y la especialización. El código que publiqué anteriormente trata sobre la instanciación explícita . La sintaxis de la especialización es diferente. Aquí está la sintaxis para la especialización:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Tenga en cuenta que los corchetes angulares después de la plantilla.


3
que es instanciación o especialización ?
Nawaz

5
No es verdad. Puede decirle al compilador que cree una instancia explícita de las plantillas. Google para "instanciación de plantilla explícita de C ++" para obtener más detalles.
hrnt

8
@Nawaz: estás equivocado. Por supuesto, siempre es el compilador el que crea una instancia, esa línea es una solicitud del programador al compilador para crear una instancia de la plantilla. Si tiene una copia del estándar C ++, lea 14.7.2 Instanciación explícita
David Rodríguez - dribeas

16
La especialización significa que probablemente esté cambiando su implementación. La creación de instancias simplemente significa que lo está asignando a una unidad de compilación en particular, posiblemente para tomar su dirección única o hacerla disponible como una función de biblioteca o para reducir la hinchazón.
CashCow

3
@hrnt: Creo que tienes razón. @Ashot: Acabo de notar que la sintaxis no tiene template<>forma. Lo que ha escrito es diferente a la especialización . +1 por enseñarme esto nuevo. Eliminaré mi publicación. : D
Nawaz

20

Tu código es correcto.

El mensaje de error pertenece a un lugar en el código que no citó aquí.

Actualizar:

El código original era

template <class T> int function_name(T a) {}
template int function_name<int>(int);

y fue correcto.

Pero no se citó y, por lo tanto, se veía así:

template int function_name(T a) {}
template int function_name(int);

Genera el siguiente error

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

que es claramente diferente de lo que OP citó.

En esta variante, la segunda línea está bien ( <int>se puede omitir aquí), pero la primera línea está defectuosa. El compilador no puede adivinar que Tes un parámetro de plantilla.


Técnicamente no era su código, era la edición de Bill :) El código original es template int function_name( T a) { }ytemplate int function_name(int);
hrnt

@hrnt El código original no estaba formateado correctamente, pero era correcto. Si yo fuera Balaji , regresaría y aceptaría tu respuesta si la considera útil, pero para mí (y presumiblemente para cualquier otra persona) tu respuesta (aunque es perfectamente correcta por sí misma) no responde a la pregunta.
Antony Hatchkins

@hrnt Tienes razón en que el código original se veía así. Pero debido al argumento de plantilla deducido, todavía funciona. Tengo que estar de acuerdo con Antony Hatchkins en que el error surge del código que el OP no citó, sin embargo, creo que su respuesta sigue siendo útil para las personas que no sabían sobre la instanciación explícita.
mpark

Bueno, tómame por ejemplo. Busqué en Google esta página cuando quería actualizar mi conocimiento bien olvidado sobre la instanciación explícita, y no me ayudó mucho. En cuanto a mí, no hay confusión sobre la sintaxis. Lo que puede causar confusión sobre la instanciación explícita es su uso
Antony Hatchkins

@AntonyHatchkins Ah, es cierto, no miré la fuente de la pregunta original, solo cómo apareció en mi pantalla. Haré +1 en esto y enmendaré mi respuesta original para notar la confusión con respecto a la pregunta original.
2014
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.