2008-08-30 14 views
22

C++ parece ser bastante malhumorado al declarar plantillas en varios 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.Plantillas distribuidas en varios archivos

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

Respuesta

23

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

Sí; no lo hagas

La especificación C++ permite que un compilador para ser capaz de "ver" toda la plantilla (declaración y definición) en el punto de instanciación, y (debido a las complejidades de cualquier aplicación) la mayoría de los compiladores conservan 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 manera más fácil de manejar 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 ofrecer 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.

5

¿A cuántos archivos hay? Si solo desea separar las definiciones de clases de la implementación, intente this article 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 sus propios makefiles o usar Visual C++ esto siempre me ha funcionado :-)

+0

+1 para el enlace con el acoplamiento del artículo –

+2

a este artículo es obsoleto! – iamantony

3

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

Ver here para una breve explicación.

También, sección 6.3, "El modelo de separación" de Plantillas C++: la Guía completa de David Vandevoorde y Nicolai M. Josuttis describe otras opciones.

alt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpg