Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: chicainge en 10 Junio 2014, 14:02 pm



Título: TAB CLista de template
Publicado por: chicainge en 10 Junio 2014, 14:02 pm
Buenas el problema que tengo es que no se como usar el template en el cpp del hpp en este programita:

Código:
#include <iostream>
#include <string>
#include "TLista.hpp"
using namespace std;
using namespace bblLista;

int main()
{
    char tipo;
    CLista<tipo> a;
    unsigned nnodos;
    char car;
    unsigned num;

    cout<<"MENU:"<<endl<<"1.INSERTAR NODOS"<<endl<<"2.ELIMINAR NODO"<<endl<<"3.ESCRIBIR LISTA"<<endl<<"4.BORRAR LISTA"<<endl;
    cin>>num;
    switch(num){
        case 1:
          cout<<"Cuantos nodos desea insertar? ";
          cin>>nnodos;
          for(unsigned i=0;i<=nnodos; i++){
          cout<<"Introduce el caracter: ";
          cin>>car;
          insertar(a,car);
          }
        break;
        case 2:
          cout<<"Escriba el caracter del nodo que desea eliminar: ";
          cin>>car;
          eliminar(a,car);
        break;
        case 3:
           consultarlista(a);
        break;
        case 4:
           borrarlista(a);
        break;
    }


}

el CLista.hpp

Código:
#ifndef _TLISTA_HPP_
#define _TLISTA_HPP_

#include <iostream>
#include <cstdlib>

using namespace std;

namespace bblLista{
  const unsigned int MAX_LISTA = 100; // Máximo tamaño de la lista

  template <typename tipo>
  class CLista{
    public:
       CLista();
       void insertar(CLista &lista, const char car);
       void eliminar(CLista &lista,const char car);
       void consultarlista(CLista &lista);
       void borrarlista(CLista &lista);
    private:

      struct TpNodo{
         tipo car;
         TpNodo *sig;
      };
      typedef TpNodo *puntalista;
      puntalista lista;
      unsigned longitud;
      //metodos pribados
      void insertaralprincipio(CLista &lista, const char car);
      void insertaralfinal(CLista &lista, const char car);
  }; // Fin de CLista
} // Fin de bblLista

#endif

y aqui es donde tengo el problemaa:

Código:
#include "CLista.hpp"
#include <iostream>
#include <cstdlib>
using namespace std;
using namespace bblLista;
  template <typename tipo>
  CLista<tipo>::CLista(): longitud(0) {};

  template <typename tipo>
  void CLista<tipo>::insertaralprincipio(CLista lista, const tipo car){
      TpNodo pun;//puntero auxiliar

      pun=new TpNodo;
      pun->car=car;
      pun->sig=lista;//recuerda que esetamos insertando al principio
      lista=pun;//lista señalaba a otro nodoya creado.
  }

  template <typename tipo>
  void CLista<tipo>::insertaralfinal(CLista &lista, const tipo car){
      TpNodo pun;
      pun=lista;
      while(pun->sig != NULL){
        pun=pun->sig;
      }
      pun->sig=new TpNodo;
      pun=pun->sig;
      pun->car=car;
      pun->sig=NULL;

      }



  template <typename tipo>
  void CLista<tipo>::insertar(CLista &lista, const tipo car){
      if(lista !=NULL){
        insertaralfinal(lista,car);
      }
      else insertaralprincipio(lista,car);
      ++longitud;
  }
  void CLista<tipo>::eliminar(CLista &lista,const tipo car){
      TpNodo pun,aux;
      pun=lista;
      while(pun->car!=car || pun->sig !=NULL){
        aux=pun;
        pun=pun->sig;
      }
      if(pun->sig==NULL){
        aux->sig=NULL;
        delete pun;
      }
      else {
        aux->sig=pun->sig;
        delete pun;
      }
     --longitud;
}

template <typename tipo>
void CLista<tipo>::consultarlista(CLista &lista){
      TpNodo pun;
      pun=lista;
      for(unsigned i=0; i<= longitud; i++){
        cin<<pun->car;
        pun=pun->sig;
      }
}

template <typename tipo>
void CLista<tipo>::borrarlista(CLista &lista){
    TpNodo aux;
  while(lista !=NULL){
    aux=lista;
    lista=lista->sig;
    delete aux;
  }
}


Título: Re: TAB CLista de template
Publicado por: eferion en 10 Junio 2014, 14:36 pm
Los templates no pueden tener código en el cpp. Tiene que estar todo en la cabecera.

La razón es sencilla. El compilador, al encontrarse con un template no lo compila, lo guarda y cada vez que encuentra un uso diferente del template crea y compila una clase específica para ese uso.