C/Visual C - plantillas

 
Vista:

plantillas

Publicado por Franco Cedillo (4 intervenciones) el 10/08/2005 23:42:44
hola,

estoy usando un archivo de Tabla.h el cual contiene una plantilla para una clase y lo uso en mi programa TablaCad.

//Tabla.h
#ifndef T_TABLA
#define T_TABLA

template <class T>
class Tabla {
public:
Tabla(int nElem);
~Tabla();
T& operator[] (int indice) { return pT[indice]; }
int NElementos() const { return nElementos; }

private:
T *pT;
int nElementos;
};

// Definición:
template <class T>
Tabla<T>::~Tabla() {
delete[] pT;
}
#endif

aki el archivo Tabla.cpp

#include <iostream>
#include <cstring>
#include <cstdio>
#include "Tabla.h"

using namespace std;

const int nElementos = 5;

using namespace std;

int main() {
Tabla<char *> TablaCad(nElementos);
char cadena[20];

for(int i = 0; i < nElementos; i++) {
sprintf(cadena, "Numero: %5d", i);
TablaCad[i] = cadena;
}

strcpy(cadena, "Modificada");

for(int i = 0; i < nElementos; i++)
cout << "TablaCad[" << i << "] = "
<< TablaCad[i] << endl;

cin.get();
return 0;
}

se produce un error de tipo linker error

y no entiendo esto porque no hubo problemas en el trabajo con int y float

#include <iostream>
#include "Tabla.h"

using namespace std;

const int nElementos = 10;

int main() {
Tabla<int> TablaInt(nElementos);
Tabla<float> TablaFloat(nElementos);

for(int i = 0; i < nElementos; i++)
TablaInt[i] = nElementos - i;

for(int i = 0; i < nElementos; i++)
TablaFloat[i] = 1/(1+i);

for(int i = 0; i < nElementos; i++) {
cout << "TablaInt[" << i << "] = "
<< TablaInt[i] << endl;
cout << "TablaFloat[" << i << "] = "
<< TablaFloat[i] << endl;
}

cin.get();
return 0;
}

pero sí con el código en el que uso char.

saludos.

Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:plantillas

Publicado por fernando.gomez (1603 intervenciones) el 11/08/2005 00:24:47
Hola, pues compilé tu código con Visual C++, y el error que me marcó fué el siguiente:

unresolved external symbol "public: __thiscall Tabla<char *>::Tabla<char *>(int)"

y este error es porque no tenías definido el cuerpo del constructor. Modifiqué la línea:

Tabla(int nElem);

por

Tabla(int nElem) { nElementos = nElem; }

y me compiló y enlazó sin problemas.

Saludos,
Fernando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:plantillas

Publicado por Franco Cedillo (4 intervenciones) el 12/08/2005 00:47:07
Hola,

Se hicieron los enlaces, eso es correcto. Incluí la línea Tabla(int nElem) { nElementos = nElem; }; y el linkeo es correcto. Pero ahora el error se ha hido al tiempo de ejecución.

así quedó "Tabla.h":

#ifndef T_TABLA
#define T_TABLA

template <class T>
class Tabla {
public:
Tabla(int nElem) { nElementos = nElem; };
~Tabla();
T& operator[] (int indice) { return pT[indice]; }
int NElementos() const { return nElementos; }

private:
T *pT;
int nElementos;
};

// Definición:
template <class T>
Tabla<T>::~Tabla() {
delete[] pT;
}
#endif

Así quedó "Tabla.cpp":

#include <iostream>
#include <cstdio>
#include "Tabla.h"
#include "CCadena.h"

using namespace std;

const int nElementos = 5;

int main() {
Tabla<Cadena> TablaCad(nElementos);
char cadena[20];
for(int i = 0; i < nElementos; i++ ) {
sprintf(cadena, "Numero: %2d", i) ;
TablaCad[i] = cadena;
}

strcpy(cadena, "Modficada");

for(int i = 0; i < nElementos; i++ ) {
cout << "TablaCad[" << i << "] = " << TablaCad[i] << endl;
}

cin.get();
return 0;
}

¿Cómo puedo saber dónde se produce el error, en este caso?

Saludos.


Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar