2011-02-08 22 views
81

Tengo una función de plantilla con un argumento. Tengo que crear una instancia de esa función sin llamar a esa función significa explícitamente que tengo que crear instancias.¿Cómo instalo explícitamente una función de plantilla?

Tengo esta función:

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

que crea una instancia de que la función de esta manera:

template int function_name<int>(int); 

Pero tengo los siguientes errores:

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

Respuesta

130

[EDIT 2]: Nota que hubo cierta confusión con respecto al código en la pregunta original debido a problemas de formato del código. Ver la respuesta de AnthonyHatchkins para más detalles.

Si realmente desea crear una instancia (en lugar de especializarse o algo así) la función, haga lo siguiente:

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

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

[EDIT] Parece que hay (mucho) de confusión con respecto a instancias explícita y especialización. El código que publiqué anteriormente trata de instanciación explícita. La sintaxis para la especialización es diferente. Aquí es la sintaxis para la especialización:

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

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

en cuenta que entre paréntesis angulares después de plantilla!

+2

que es * instanciación * o * especialización *? – Nawaz

+1

Esto es instanciación. – hrnt

+0

@hrnt: compilador * "instancia" * plantillas, programadores solamente * "lo especializa" * it. ¡La creación de instancias es un acto de crear una especialización de plantillas por parte de los compiladores! – Nawaz

16

Tu código es correcto.

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

Actualización:

Código original era

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

y era correcta.

Pero no fue citado y por lo tanto se veía así:

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

Se 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 citado OP.

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

+0

Técnicamente no era su código, era la edición de Bill :) El código original es 'plantilla int nombre_función (T a) {}' y 'plantilla int nombre_función (int);' – hrnt

+0

@hrnt El código original no estaba formateado correctamente, aún fue correcto Si yo fuera __Balaji__, regresaría y aceptaría su respuesta si lo considera útil, sin embargo, para mí (y presumiblemente para cualquier otra persona) su respuesta (aunque está perfectamente en lo cierto) no responde la pregunta. –

+0

@hrnt Tienes razón de que el código original se veía así. Pero debido al argumento de la plantilla deducida, 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 aún es útil para las personas que no sabían sobre ejemplificación explícita. – mpark

Cuestiones relacionadas