2009-03-20 7 views
7

Siendo un novato de dll tengo que preguntarle al todopoderoso SO sobre algo.Importación de clase de plantilla explícitamente instanciada de dll

decir te instanciar una clase de plantilla de forma explícita como esto:

template class __declspec(dllexport) B<int>; 

¿Cómo se utiliza la importación de esta clase con plantilla de nuevo?

he probado el de añadir el siguiente código en mi archivo .cpp donde quiero usar B

template class __declspec(dllimport) B<int>; 
+0

"He intentado agregar el código a continuación en mi archivo .cpp donde quiero usar B" ¿qué has averiguado? ¿Recibiste errores? ¿Puedes poner en tu pregunta lo que sucedió entonces? –

Respuesta

4

Al crear una instancia de una plantilla totalmente - usted tiene un tipo completo. No es diferente de cualquier otro tipo. Debe incluir el encabezado para B y también enlazar el tiempo de compilación con un archivo lib o cargar dinámicamente el dll para vincularlo a la definición.

Has leído este artículo: http://support.microsoft.com/kb/168958?

He aquí un breve resumen de lo que he probado (y funcionó):


Crear un proyecto DLL ficticia

  • Se utiliza el asistente de la aplicación de consola Win32 para generar la cabecera DLL/archivos fuente llamados: template_export_test
  • Agregado lo siguiente:

archivo: template_export_test.h


#ifndef EXP_STL 
#define EXP_STL 
#endif 

#ifdef EXP_STL 
# define DECLSPECIFIER __declspec(dllexport) 
# define EXPIMP_TEMPLATE 
#else 
# define DECLSPECIFIER __declspec(dllimport) 
# define EXPIMP_TEMPLATE extern 
#endif 

EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>; 

archivo: template_export_test.cpp


template<class T> 
CdllTest<T>::CdllTest(T t) 
: _t(t) 
{ 
    std::cout << _t << ": init\n"; 
} 

Crear la aplicación de prueba

  • Usar el asistente para crear una aplicación de consola Win32 denominada: driver
  • Editar la configuración del proyecto enlazadores de este proyecto:
    • Añadir a Enlazador> General> Directorios de biblioteca adicionales: camino a template_export_test.lib
    • Añadir a Linker> entrada> dependencias adicionales: template_export_test.lib
  • Incluya la template_export_test.h en el archivo CPP principal

#include "c:\Documents and Settings\...\template_export_test.h" 
using namespace std; 

int main(int argc, char** argv) { 
    CdllTest<int> c(12); 
} 

  • Compilar y listo!
+0

Lo he intentado: clase de plantilla externa __declspec (dllimport) B ; No funcionó. – Nailer

+0

Gracias por el enlace. Sin embargo, creo que su muestra no funciona bien. #ifndef EXP_STL #define EXP_STL no es correcto, y no es coherente con el enlace que proporcionó. –

0

Parece que, incluso con la instalación explícita de la plantilla, pueden surgir problemas que conducen a errores de tiempo de ejecución. Eche un vistazo a this interesting article to C4251 (especialmente la "Conclusión").

Cuestiones relacionadas