Figura 1: plantillas de funciones
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
¿Es esta la forma correcta de usar extern template
, o utilizo esta palabra clave solo para plantillas de clase como en la Figura 2?
Figura 2: plantillas de clases
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
Sé que es bueno poner todo esto en un archivo de encabezado, pero si instanciamos plantillas con los mismos parámetros en varios archivos, obtendremos varias definiciones iguales y el compilador las eliminará todas (excepto una) para evitar errores. ¿Cómo lo uso extern template
? ¿Podemos usarlo solo para clases, o podemos usarlo también para funciones?
Además, la Figura 1 y la Figura 2 pueden expandirse a una solución donde las plantillas están en un solo archivo de encabezado. En ese caso, necesitamos usar la extern template
palabra clave para evitar múltiples instancias iguales. ¿Es esto solo para clases o funciones también?
extern template class foo<int>();
parece un error.
()
de la línea externa. tanto su libro como visual studio están equivocados, intente usar un compilador compatible con más estándares como g ++ o clang y verá el problema.