• Viernes 8 de Noviembre de 2024, 19:42

Autor Tema:  undefined reference to 'nombre de funcion'  (Leído 1846 veces)

etchner

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
undefined reference to 'nombre de funcion'
« en: Miércoles 4 de Mayo de 2011, 16:53 »
0
Hola

Estaba practicando con el uso de plantillas en c++, y tengo el siguiente codigo

Fichero Conjunto.h
Código: Text
  1.  
  2.     template <class TIPOP>
  3.     class posicion;
  4.      
  5.     template <class TIPO>
  6.     class conjunto{
  7.     public:
  8.      
  9.             conjunto();
  10.      
  11.             conjunto(const conjunto &c);
  12.      
  13.             bool pertenece(TIPO elem) const;
  14.      
  15.             void insertar(TIPO elem);
  16.      
  17.             void borrar(TIPO elem);
  18.      
  19.      
  20.             bool vacio(TIPO elem) const;
  21.      
  22.      
  23.             posicion<TIPO> begin();
  24.      
  25.             posicion<TIPO> end();
  26.      
  27.      
  28.             posicion<TIPO> siguiente(posicion<TIPO> posic);
  29.      
  30.             TIPO& elemento(posicion<TIPO> posic);
  31.      
  32.      
  33.             const TIPO& elemento(posicion<TIPO> posic) const;
  34.      
  35.      
  36.             TIPO& elemento(int posic);
  37.      
  38.      
  39.             int getCardinalidad();
  40.      
  41.     private:
  42.             void resize(int tam);
  43.            
  44.             TIPO* elementos;
  45.             int cardinalidad;      
  46.      
  47.     };
  48.      
  49.     template <class TIPOP>
  50.     class posicion{
  51.             conjunto<TIPOP> subconjunto;
  52.             int indice;
  53.     };
  54.  


Fichero Conjunto.cpp

Código: Text
  1.     #include<Conjunto.h>
  2.      
  3.                     conjunto<TIPO>::conjunto(){}
  4.      
  5.                     conjunto<TIPO>::conjunto(const conjunto<TIPO> &c){}
  6.      
  7.     bool            conjunto<TIPO>::pertenece(TIPO elem) const{}
  8.      
  9.     void            conjunto<TIPO>::insertar(TIPO elem){}
  10.      
  11.     void            conjunto<TIPO>::borrar(TIPO elem){}
  12.      
  13.     bool            conjunto<TIPO>::vacio(TIPO elem) const{}
  14.      
  15.     posicion<TIPO>  conjunto<TIPO>::begin(){}
  16.      
  17.     posicion<TIPO>  conjunto<TIPO>::end(){}
  18.      
  19.     posicion<TIPO>  conjunto<TIPO>::siguiente(posicion<TIPO> posic){}
  20.      
  21.     TIPO&           conjunto<TIPO>::elemento(posicion<TIPO> posic){}
  22.      
  23.     TIPO&           conjunto<TIPO>::elemento(int posic){}
  24.      
  25.     const TIPO&     conjunto<TIPO>::elemento(posicion<TIPO> posic) const{}
  26.  
  27.  

Fichero usoConjunto.cpp
Código: Text
  1.  
  2.     #include "Conjunto.h"
  3.      
  4.     using namespace std;
  5.      
  6.     conjunto<int> unionc(conjunto<int> c1, conjunto<int> c2){
  7.      
  8.             conjunto<int> nuevo;
  9.             for(int c = 0; c < c1.getCardinalidad(); c++){
  10.                     nuevo.insertar(c1.elemento(c));
  11.             }
  12.      
  13.             for (int a = 0; a < c2.getCardinalidad();a++){
  14.                     nuevo.insertar(c2.elemento(a));
  15.             }
  16.      
  17.             return nuevo;
  18.     }
  19.      
  20.      
  21.     int main(){}
  22.  

Al compilarlo con make, me da la siguiente salida:

usoConjunto.cpp:(.text+0x1b): undefined reference to `conjunto<int>::conjunto()'
usoConjunto.cpp:(.text+0x35): undefined reference to `conjunto<int>::elemento(int)'
usoConjunto.cpp:(.text+0x44): undefined reference to `conjunto<int>::insertar(int)'
usoConjunto.cpp:(.text+0x54): undefined reference to `conjunto<int>::getCardinalidad()'
usoConjunto.cpp:(.text+0x78): undefined reference to `conjunto<int>::elemento(int)'
usoConjunto.cpp:(.text+0x87): undefined reference to `conjunto<int>::insertar(int)'
usoConjunto.cpp:(.text+0x97): undefined reference to `conjunto<int>::getCardinalidad()'


He buscado por internet y por lo que veo hay un error al enlazar, pero no se como solucionarlo :S

alexg88

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: undefined reference to 'nombre de funcion'
« Respuesta #1 en: Miércoles 4 de Mayo de 2011, 17:45 »
0
Cuatro cosas:

1. Pon #include "Conjunto.cpp" al final del fichero Conjunto.h
2. Tienes que poner template <class TIPO> antes de cada  método en Conjunto.cpp para declarar que es una plantilla.
3. El #include <Conjunto.h> cambialo por #include "Conjunto.h"
4. La funciones getCardinalidad y resize no las defines en ninguna parte, tienes que definirlas.

Es importante que compiles sólo usoConjunto.cpp, porque Conjunto.cpp se compilará cuando Conjunto.h lo requiera, creando las métodos necesarios a partir de la plantilla.

Hay otra forma de hacerlo sin poner #include "Conjunto.cpp" en el fichero Conjunto.h, que es poner en el propio Conjunto.h las definiciones de los metodos directamente y entonces si lo compilarías de la manera normal (es decir, los métodos con plantilla los defines en Conjunto.h y los de sin plantilla en Conjunto.cpp).

Fichero Conjunto.h
Código: C++
  1.  
  2.  
  3.     template <class TIPOP>
  4.     class posicion;
  5.      
  6.     template <class TIPO>
  7.     class conjunto{
  8.     public:
  9.      
  10.             conjunto();
  11.      
  12.             conjunto(const conjunto &c);
  13.      
  14.             bool pertenece(TIPO elem) const;
  15.      
  16.             void insertar(TIPO elem);
  17.      
  18.             void borrar(TIPO elem);
  19.      
  20.      
  21.             bool vacio(TIPO elem) const;
  22.      
  23.      
  24.             posicion<TIPO> begin();
  25.      
  26.             posicion<TIPO> end();
  27.      
  28.      
  29.             posicion<TIPO> siguiente(posicion<TIPO> posic);
  30.      
  31.             TIPO& elemento(posicion<TIPO> posic);
  32.      
  33.      
  34.             const TIPO& elemento(posicion<TIPO> posic) const;
  35.      
  36.      
  37.             TIPO& elemento(int posic);
  38.      
  39.      
  40.             int getCardinalidad();
  41.      
  42.     private:
  43.             void resize(int tam);
  44.            
  45.             TIPO* elementos;
  46.             int cardinalidad;      
  47.      
  48.     };
  49.      
  50.     template <class TIPOP>
  51.     class posicion{
  52.             conjunto<TIPOP> subconjunto;
  53.             int indice;
  54.     };
  55.  
  56. #include "Conjunto.cpp"
  57.  
  58.  

Fichero Conjunto.cpp


Código: C++
  1.  
  2.  
  3. template <class TIPO>  conjunto<TIPO>::conjunto(){}
  4.      
  5. template <class TIPO>                     conjunto<TIPO>::conjunto(const conjunto<TIPO> &c){}
  6.      
  7.   template <class TIPO>   bool            conjunto<TIPO>::pertenece(TIPO elem) const{}
  8.      
  9.  template <class TIPO>    void            conjunto<TIPO>::insertar(TIPO elem){}
  10.      
  11.  template <class TIPO>    void            conjunto<TIPO>::borrar(TIPO elem){}
  12.      
  13.  template <class TIPO>    bool            conjunto<TIPO>::vacio(TIPO elem) const{}
  14.      
  15.  template <class TIPO>    posicion<TIPO>  conjunto<TIPO>::begin(){}
  16.      
  17.  template <class TIPO>    posicion<TIPO>  conjunto<TIPO>::end(){}
  18.      
  19.   template <class TIPO>   posicion<TIPO>  conjunto<TIPO>::siguiente(posicion<TIPO> posic){}
  20.      
  21.   template <class TIPO>   TIPO&           conjunto<TIPO>::elemento(posicion<TIPO> posic){}
  22.      
  23.  template <class TIPO>    TIPO&           conjunto<TIPO>::elemento(int posic){TIPO var;
  24.                                                                             return var;}
  25.      
  26.   template <class TIPO>   const TIPO&     conjunto<TIPO>::elemento(posicion<TIPO> posic) const{}
  27.  
  28.   template <class TIPO> int conjunto<TIPO>::getCardinalidad(){return 0;}
  29.  
  30.   template <class TIPO> void conjunto<TIPO>::resize(int tam){};
  31.  
  32.  

Espero que te funciones

etchner

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: undefined reference to 'nombre de funcion'
« Respuesta #2 en: Miércoles 4 de Mayo de 2011, 20:12 »
0
Muchas gracias, creía que solo era necesario indicar la plantilla al principio de la clase.  ya le voy pillando el truco al uso de las templates ;)