Cita:
Iniciado por GumiCat Ah, vale gracias no tenía idea de que no podía dividirse! :)
Los templates sí pueden dividirse... lo que pasa es que, de hacerlo, tiene sus propias reglas.
Un código normal de C++ tiene la siguiente estructura:
- Tenemos un archivo de cabecera y otro con la implementación
- En la implementación se añade un include a la cabecera. Este include tiene que estar al principio del archivo
- Para hacer uso de la funcionalidad contenida en estos archivos, hay que añadir un include a la cabecera.
En los templates habría que seguir de la siguiente forma:
- Tenemos un archivo de cabecera y otro con la implementación
- En la cabecera se añade un include a la implementación. Este include tiene que estar al final del archivo
- Para hacer uso de la funcionalidad contenida en estos archivos, hay que añadir un include a la cabecera.
Fíjate el cambio que se produce en el segundo punto.
¿Por qué esto es así? Sencillamente porque los templates son tratados de forma especial por el compilador. Cuando un compilador se encuentra con un template no genera absolutamente nada de código. Lo que hace es esperar a encontrar usos de ese template para generar las versiones específicas que se requieran. Para poder generar estas versiones específicas necesita tener
TODO el código fuente del template disponible y la única forma de garantizar esto es que tanto declaración como implementación estén en el mismo archivo.
Como sabes, o sino ahora lo vas a aprender, los includes son sustituidos por el contenido del fichero "incluido" antes de proceder a la compilación. Es gracias a este preproceso por el que puedes separar la declaración y la implementación de los templates y que el código siga funcionando. El único requisito es que el compilador tenga disponible las dos partes del template en el momento en el que se encuentre cualquier uso.
Por supuesto, haciendo uso de lo que te acabo de comentar, habría otras maneras de dividir el template y que el código compile:
- Tener la implementación y la declaración en dos archivos independientes, sin includes entre ellos y crear un tercer archivo que únicamente tenga dos includes, uno a la declaración y después otro a la implementación. Este tercer archivo es el que tendrás que incluir para usar el template
- Añadir los dos includes (declaración e implementación) manualmente cada vez que necesites usar el template
Un saludo.