TAB CLista de template

Iniciado por chicainge, 10 Junio 2014, 14:02 PM

0 Miembros y 1 Visitante están viendo este tema.

chicainge

Buenas el problema que tengo es que no se como usar el template en el cpp del hpp en este programita:


#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

#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:

#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;
  }
}

eferion

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.