the template guide geeksforgeeks example c++ templates

c++ - template - Plantillas distribuidas en varios archivos



template function c++ (3)

¿Hay algún consejo general o soluciones para organizar o redistribuir las definiciones de miembros con plantillas en varios archivos?

Sí; no lo hagas

La especificación de C ++ permite que un compilador pueda "ver" la plantilla completa (declaración y definición) en el momento de la creación de instancias, y (debido a las complejidades de cualquier implementación) la mayoría de los compiladores retienen este requisito. El resultado es que #inclusion de cualquier encabezado de plantilla también debe incluir #include cualquiera y todas las fuentes requeridas para instanciar la plantilla.

La forma más fácil de lidiar con esto es volcar todo en el encabezado, en línea donde sea posible, fuera de línea cuando sea necesario.

Si realmente considera esto como una afrenta inaceptable, una opción común es dividir la plantilla en el par de encabezado / implementación usual, y luego #incluir el archivo de implementación al final del encabezado.

La característica de "exportación" de C ++ puede proporcionar o no otra solución alternativa. La característica tiene poco soporte y está mal definida; aunque en principio debería permitir algún tipo de compilación separada de plantillas, no necesariamente obvia la demanda de que el compilador pueda ver todo el cuerpo de la plantilla.

C ++ parece ser bastante malhumorado al declarar plantillas en múltiples archivos. Más específicamente, cuando se trabaja con clases con plantillas, el enlazador espera todas las definiciones de métodos para la clase en un solo archivo de objeto del compilador. Cuando tomas en cuenta encabezados, otras declaraciones, herencia, etc., las cosas se ponen realmente desordenadas.

¿Hay algún consejo general o soluciones para organizar o redistribuir las definiciones de miembros con plantillas en varios archivos?


¿A través de cuántos archivos? Si solo desea separar las definiciones de clases de la implementación, pruebe este artículo en las preguntas frecuentes de C ++. Es la única forma que conozco de que funcione en este momento, pero algunos IDEs (Eclipse CDT, por ejemplo) no vincularán este método correctamente y es posible que obtenga muchos errores. Sin embargo, escribir tus propios makefiles o usar Visual C ++ siempre me ha funcionado :-)


Cuando / si su compilador admite C ++ 0x, la palabra clave extern se puede usar para separar las declaraciones de plantilla de las definiciones.

Vea aquí para una breve explicación.

Además, la sección 6.3, "El modelo de separación", de las plantillas de C ++: The Complete Guide, de David Vandevoorde y Nicolai M. Josuttis, describe otras opciones.

texto alternativo http://ak.buy.com/db_assets/prod_images/235/31025235.jpg