¿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í:
templateint function_name<int>(int);
Pero tengo los siguientes errores:
error: expected primary-expression before 'template'
error: expected `;' before 'template'
[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:
[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:
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í.
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.
template<>
forma. Lo que ha escrito es diferente a la especialización . +1 por enseñarme esto nuevo. Eliminaré mi publicación. : DTu 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
y fue correcto.
Pero no se citó y, por lo tanto, se veía así:
Genera el siguiente error
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 queT
es un parámetro de plantilla.fuente
template int function_name( T a) { }
ytemplate int function_name(int);