• Domingo 22 de Diciembre de 2024, 22:13

Autor Tema:  Problema Con Templates En C++  (Leído 3125 veces)

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Problema Con Templates En C++
« en: Jueves 24 de Junio de 2004, 17:25 »
0
Hola.

He estado intentando separar la implementación de una clase template de su declaración en el .h, ya que es mucho código y está bastante poco claro. Para que veáis un ejemplo, os pongo una simplificación del problema:

Código: Text
  1. // plantilla.h
  2.  
  3. template <class T>
  4. class CPlantilla
  5. {
  6. public:
  7.   CPlantilla(T var)
  8.   {
  9.     m_var = var;
  10.   }
  11. private:
  12.   T m_var;
  13. };
  14.  

Yo lo que quiero es que la implementación del método esté en otro archivo, por lo que éste lo convierto en:
Código: Text
  1. // plantilla.h (nuevo)
  2.  
  3. template <class T>
  4. class CPlantilla
  5. {
  6. public:
  7.   CPlantilla(T var);
  8.  
  9. private:
  10.   T m_var;
  11. };
  12.  

y creo un nuevo .cpp, con la implementación:
Código: Text
  1. // plantilla.cpp
  2.  
  3. #include "plantilla.h"
  4.  
  5. template <class T>
  6. CPlantilla<T>::CPlantilla(T var)
  7. {
  8.   m_var = var;
  9. }
  10.  

De esta manera compila sin problemas, y si utilizo la clase en plantilla.cpp todo funciona bien. El problema está en si yo creo un tercer archivo, de esta manera:
Código: Text
  1. // prueba.cpp
  2.  
  3. #include "plantilla.h"
  4.  
  5. void usarPlantilla()
  6. {
  7.   CPlantilla<int> p(4);
  8. }
  9.  

No tengo problemas al compilar, pero al linkar me dice que no se encuentra la implementación del constructor, que está en plantilla.cpp.

Claramente, esto se puede resolver dejando la implementación de la clase en el archivo de cabecera, pero por lo dicho al principio quiero separar la implementación de la declaración. ¿Alguien sabe cómo llevar esto a cabo?

Muchas gracias.

Un saludo.

Ruben3d

PD: Estoy compilando con eVC++ 4, por si es cosa del soporte del compilador para templates.

EDIT: Acabo de probarlo con el VS 7 y ocurre lo mismo :(
EDIT2: Lo he probado en Dev-C++ y más de lo mismo.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problema Con Templates En C++
« Respuesta #1 en: Jueves 24 de Junio de 2004, 22:00 »
0
Hola de nuevo.

He estado husmeando entre las páginas del libro de Stroustrup y he encontrado en el capítulo dedicado a templates que lo que quiero se hace usando la palabra reservada export.

Por desgracia, ningún compilador lo implementa aún, ni GCC, ni Visual Studio, ni ninguno. Excepto Comeau C/C++, que ha sido el primero en implementarla.

Así, tendré que esperar hasta que a la gente se le ocurra implementarla en los compiladores.

Un saludo.

Ruben3d

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Problema Con Templates En C++
« Respuesta #2 en: Lunes 28 de Junio de 2004, 01:57 »
0
Hola Ruben3d!!!

Hay algo q no te entendi y es q vos queres separar en distintos archivos la implementacion de la declaracion.

Los Templates lamentablemente tienen q estar declarados e implementados en un .h si vos quisieras compartirlos con otra gente. Obviamente q te va a compilar si le metes en un .cpp la implementacion, pero si se lo das a alguien y el chabon lo quiere usar con un tipo de dato "unsigned short" por ejemplo, como hace el compilador para generar codigo para ese tipo de dato si vos ya le diste compilado el fuente??? No se puede, y es por eso q tenes q poner todo en un .h si queres compartir las cosas. Esto atenta contra el ocultamiento de la informacion, pero es lo q hay

Salu2!!!!!

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problema Con Templates En C++
« Respuesta #3 en: Lunes 28 de Junio de 2004, 12:09 »
0
Hola.

Soy consciente de que con el soporte actual hay que dejar la implementación en el fichero de cabecera. Esto fuerza que todos los métodos sean inline. ¿Pero qué pasa si yo no quiero que unos fragmentos de código bastante grandes estén repetidos cada vez que uso la clase template? Con la palabra reservada export debería poder definir la implementación en un fichero cpp, y ser el compilador el encargado de generar en su fichero objeto todas las especializaciones de la clase, en vez de generar el código en cada lugar que se utilice. Para distribuirlo, habría que distribuir el fichero de cabecera y el cpp.

Un saludo.

Ruben3d

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Problema Con Templates En C++
« Respuesta #4 en: Martes 29 de Junio de 2004, 01:18 »
0
Hola!!!!!!

Si haces tu clase template para por ejemplo cualquier tipo de numero (unsigned short, unsigned long, int, double, float, etc), solo escribiras el codigo una sola vez y cuando intsancies un template, no tendras q escribir codigo de mas. Lo q no te entiendo es por que decis q tenes q escribir muchas veces el codigo. La idea de los templates es q lo escribas una sola vez


Salu2!!!!!!!

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problema Con Templates En C++
« Respuesta #5 en: Martes 29 de Junio de 2004, 11:41 »
0
No soy yo el que escribe muchas veces el código, es el compilador cuando genera el código máquina. Al poner la implementación en el fichero de cabecera el código se genera inline, y yo lo que quiero es que se realicen llamadas a funciones, no que se escriba todo el código cada vez que se use (me refiero a que lo escriba el compilador, no yo).

Un saludo.

Ruben3d

ragnarok

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Problema Con Templates En C++
« Respuesta #6 en: Martes 29 de Junio de 2004, 22:36 »
0
Yo estoy aprendiendo programación orientada a objetos ahora mismo, pero hasta donde yo se lo que hay que hacer para que los métodos no sean inline es escribir su implementación fuera de la declaración de la clase (o plantilla) aunque sea en el mismo fichero. Si además puedes implementarlos en otro fichero el código puede quedar más claro (si es posible) y puede ser mejor, aunque solo sea porque los ficheros .h son sólo de declaración y los .cpp de implementación.

Supongo que además has creado un proyecto para que linke todos los archivos del proyecto juntos.

De todas formas los constructores suelen ser inline, aunque supongo que las clases que realmente quieres hacer son más complejas que las que has puesto en los ejemplos.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problema Con Templates En C++
« Respuesta #7 en: Miércoles 30 de Junio de 2004, 00:56 »
0
ragnarok lo ha descrito perfectamente. Yo quiero que la implementación no sea inline, que vaya en el cpp. Pero para que eso se pueda hacer con plantillas hace falta que el compilador lo implemente con export, y no lo hacen.

Un saludo.

Ruben3d

ragnarok

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Problema Con Templates En C++
« Respuesta #8 en: Miércoles 30 de Junio de 2004, 17:20 »
0
No no, lo que yo digo es que puedes hacer un fichero de cabecera.h que contenga la plantilla con sus métodos sin que estos sean inline de la siguiente manera:

Código: Text
  1. #ifndef CPlantilla_H
  2. #define CPlantilla_H
  3.  
  4.    template <class T>
  5.    class CPlantilla{
  6.        public:
  7.          CPlantilla(T var);
  8.          private:
  9.            T m_var;
  10.    };
  11.    
  12.    template <class T> CPlantilla<T>::CPlantilla(T var){
  13.        m_var = var;
  14.    }
  15.  
  16. #endif
  17.  

Creo que de esta manera los métodos no son inline, aunque la declaración esté con la implementación en el mismo fichero.

PD: He tenido que editar el post porque parecía que compilaba si ponía el método en un fichero de implementación .cpp, pero creo que ha sido una confusión por no hacer makeclean.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problema Con Templates En C++
« Respuesta #9 en: Miércoles 30 de Junio de 2004, 20:26 »
0
Por definición, la única manera de que una plantilla no sea inline es usando export. Puedes consultarlo en el capítulo dedicado al respecto del libro de Stroustrup. Sé que compila si lo pones en el .cpp, ese caso lo expliqué en el primer post, pero no lo enlaza desde otra unidad de traducción.

Un saludo.

Ruben3d