Newsgroup: it.comp.lang.c++
Titolo: problema coi template

siccome deov avere classi che fanno le stesse operazioni su tipi di dato
diversi ho penstao di creare un tempalte. Solo che non funziona
allora, il programma e' un banale
------------------------main.cc--------------------------
#include "data.h"
using namespace Turbo;
int main (void) {
        Data<char> *data = new Data<char> (10);
        return 0;
}
--------------------- fine main.cc ----------------------
e il template della classe data e' definito in data.h
------------------------data.h---------------------------
#ifndef _DATA_H_
#define _DATA_H_
#include <vector>
/**
 * @file data.h
 * @brief Interface for the objects containing the data.
 */
namespace Turbo
{
  /**
   *@brief Interface for the objects containing the data.
   */
  template < class T >
  class Data
  {
  public:
    Data (int size);
    Data (std::vector < T > *t);
    ~Data ();
    Data<T> *clone (void);
    T at (int index);
    void set (int index, T value);
    int size (void);
  private:
    std::vector < T > *_data;
  };
}
#endif /* _DATA_H_ */
--------------------fine data.h----------------------------
e la sua implementazone e' nel file data.cc
---------------------data.cc-------------------------------
#include "data.h"
using namespace Turbo;
template < class T >
Data<T>::Data (int size)
{
  _data = new std::vector < T > (size, 0);
}
template < class T >
Data < T >::Data (std::vector < T > *t)
{
  _data = t->clone ();
}
template < class T >
Data<T>::~Data ()
{
  delete (_data);
}
template < class T >
Data < T >* Data<T>::clone (void)
{
  return new Data<T> (_data);
}
template < class T >
T Data<T>::at (int index)
{
  return _data->at (index);
}
template < class T > void
Data<T>::set (int index, T value)
{
  assign (index, value);
}
template < class T >
int Data<T>::size (void)
{
  return _data->size ();
}
-------------------------fine data.cc ------------------------------
Se provo a compilare mi dice
g++ -Wall -g  -lm  -o turbo  main.o data.o
main.o: In function `main':
/home/bott/Progetti/turbo/src/main.cc:10: undefined reference to
`Turbo::Data<char>::Data(int)'
collect2: ld returned 1 exit status
make: *** [turbo] Error 1
e non riesco a capire perche' non va....
Inoltre vi chiedo un'altra cosa: c'e' un modo per evitare di ripetere
sempre "template <class T>" in data.cc ?
Grazie

 e non riesco a capire perche' non va....
devi includere la definizione dei metodi della classe template 
nell'header file. Niente file .h e .cc come per le altre classi normali, 
soltanto un file .h con dichiarazioni + definizioni.
-- 
MSN: sirpsycho_78 -at- hotmail dot com
"ah, eri te quello..."

 }
std::vector non ha una funzione clone.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 Data<char> data(10);
e questo mi da' gia' un array? senza il puntatore e il new al posto di
quella che sarebbe stata la malloc?

 quella che sarebbe stata la malloc?
Uhm... un attimo. Cosa intendi dire?
Data<char> *data = new Data<char>(10) alloca (dinamicamente) UN oggetto 
di tipo Data<char> passando 10 al costruttore di Data<char>.
Il costruttore di Data<char> alloca (dinamicamente) uno std::vector<char>
contenente 10 elementi inizializzati a 0.
Esattamente quello che avresti ottenuto usando l'allocazione automatica, 
evitando il problema di dover gestire i puntatori ed essendo più
efficiente.
