Pregunta

C++ parece bastante irritable al declarar plantillas en varios archivos.Más específicamente, cuando se trabaja con clases con plantilla, el vinculador espera todas las definiciones de métodos para la clase en un único archivo objeto del compilador.Cuando se tienen en cuenta los encabezados, otras declaraciones, la herencia, etc., las cosas se complican mucho.

¿Existe algún consejo general o solución alternativa para organizar o redistribuir definiciones de miembros con plantilla en varios archivos?

¿Fue útil?

Solución

¿Existe algún consejo general o solución alternativa para organizar o redistribuir definiciones de miembros con plantilla en varios archivos?

Sí;no.

La especificación de C++ permite que un compilador pueda "ver" la plantilla completa (declaración y definición) en el punto de creación de instancias y (debido a las complejidades de cualquier implementación) la mayoría de los compiladores mantienen este requisito.El resultado es que la #inclusión de cualquier encabezado de plantilla también debe #incluir todas y cada una de las fuentes necesarias para crear una instancia de la plantilla.

La forma más sencilla de solucionar esto es volcar todo en el encabezado, en línea cuando sea posible y 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 habitual encabezado/implementación y luego #incluir el archivo de implementación al final del encabezado.

La función de "exportación" de C++ puede proporcionar o no otra solución.La característica no está bien respaldada y mal definida;aunque en principio debería permitir algún tipo de compilación separada de plantillas, no necesariamente elimina la exigencia de que el compilador pueda ver el cuerpo completo de la plantilla.

Otros consejos

¿En cuántos archivos?Si solo desea separar las definiciones de clases de la implementación, intente Este artículo en las preguntas frecuentes de C++.Esa es la única forma que conozco de que funcione en este momento, pero algunos IDE (Eclipse CDT, por ejemplo) no vinculan este método correctamente y es posible que se produzcan muchos errores.Sin embargo, escribir tus propios archivos MAKE o usar Visual C++ siempre me ha funcionado :-)

Cuando/si su compilador soporta C++ 0x, el extern La palabra clave se puede utilizar para separar las declaraciones de plantilla de las definiciones.

Ver aquí para una breve explicación.

Además, la sección 6.3, "El modelo de separación", de Plantillas C++:La guía completa por David Vandevoorde y Nicolai M.Josuttis describe otras opciones.

alt text

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top