C++ parece ser más bien de mal humor cuando se declara plantillas a través de múltiples archivos. Más específicamente, cuando se trabaja con plantillas de clases, el enlazador de esperar que todas las definiciones de métodos para la clase en un único compilador de archivo de objeto. Cuando se toma en cuenta los encabezados, otras declaraciones, la herencia, etc., las cosas se ponen realmente complicado.

Hay consejos generales o de soluciones para la organización o de la redistribución de la plantilla de las definiciones de los miembros a través de múltiples archivos?

InformationsquelleAutor Vicent Marti | 2008-08-30

3 Comentarios

  1. 26

    Hay consejos generales o de soluciones para la organización o de la redistribución de la plantilla de las definiciones de los miembros a través de múltiples archivos?

    Sí; no.

    El C++ especificación de los permisos de un compilador para ser capaz de «ver» toda la plantilla (declaración y definición) en el punto de la creación de instancias, y (debido a la complejidad de la aplicación) la mayoría de los compiladores de conservar este requisito. El resultado de todo esto es que la #inclusión de cualquier plantilla de encabezado debe también #include cualquier y todo el código fuente necesario para crear instancias de la plantilla.

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

    Si realmente consideran esto como una afrenta inaceptable, una opción común es dividir a la plantilla de lo habitual en el encabezado y/o implementación de par, y luego #include en el archivo de implementación al final de la cabecera.

    C++’s «exportar» característica puede o no puede proporcionar otra solución. La característica está mal apoyado y bien definidos, aunque en principio debería permitir algún tipo de compilación independiente de las plantillas, no necesariamente obviar la demanda que el compilador sea capaz de ver todo el cuerpo de la plantilla.

  2. 5

    A lo largo de muchos archivos? Si usted acaba de querer separar las definiciones de clase de la aplicación, a continuación, intente este artículo en el C++ preguntas frecuentes. Que trata de la única forma que conozco de que funciona en el momento, pero algunos Ide (Eclipse CDT por ejemplo) no enlace de este método correctamente y usted puede conseguir un montón de errores. Sin embargo la escritura de su propia makefiles o utilizando Visual C++, esto siempre ha funcionado para mí 🙂

    • +1 para el enlace del artículo
    • enlace al artículo es obsoleta!
  3. 3

    Cuando/si el compilador soporta C++0x, el extern palabra clave puede ser usado para separar la plantilla de las declaraciones de las definiciones.

    Ver aquí para una breve explicación.

    También, la sección 6.3, «La Separación de la Modelo,» de las Plantillas de C++: La Guía Completa por David Vandevoorde y Nicolai M. Josuttis se describen otras opciones.

    Plantillas de propagación a través de múltiples archivos

Dejar respuesta

Please enter your comment!
Please enter your name here