[C con Clase] Error copilando un ejemplo del curso de C++ con Clase

aJ maxell1001 en gmail.com
Jue Mar 31 23:18:38 CEST 2011


Buenas,

En el ejemplo de Clase o función amiga de una plantilla → http://bit.ly/gA57Kw 
, me da error copilando con GNU GCC Compiler, elimine la parte de "<>" por que me daba error con ese copilador y a la final me quedaron dos errores que no se como solucionarlos:

Log de errores :

obj\Debug\1.o||In function `main':|
D:\X\Code_Blocks\prueba_1\1.cpp|17|undefined reference to `Mostrar(tabla<int>&)'|
D:\X\Code_Blocks\prueba_1\1.cpp|19|undefined reference to `Mostrar(tabla<cadena>&)'|
||=== Build finished: 2 errors, 0 warnings ===|

A continuación mi código, yo siempre le cambio cosas al código para que no se parezca al original pero no altera la funcionalidad del programa :

3.h :

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
template <class T>
class tabla
{
    public:
    tabla(int n);
    ~tabla();
    T& operator[](int indice) { return p_t[indice]; }
    int dev_elem() const { return n_elem; }
    friend void Mostrar(tabla<T>&);
    private:
    T *p_t;
    int n_elem;
};
template <class T>
tabla<T>::tabla(int n) : n_elem(n)
{
    p_t = new T[n_elem];
}
template <class T>
tabla<T>::~tabla()
{
    delete[] p_t;
}
using std::strcpy;
using std::strlen;
class cadena
{
    public:
    cadena(const char *cad)
    {
        cad_2 = new char[strlen(cad)+1];
        strcpy(cad_2,cad);
    }
    cadena() : cad_2(0) {}
    cadena(const cadena &c) : cad_2(0) { *this = c; }
    ~cadena() { if(cad_2) delete[] cad_2; }
    cadena &operator=(const cadena& c)
    {
        if(this != &c)
        {
            if(cad_2) delete[] cad_2;
            if(c.cad_2)
            {
                cad_2 = new char[strlen(c.cad_2)+1];
                strcpy(cad_2,c.cad_2);
            }
            else cad_2 = 0;
        }
        return *this;
    }
    const char* lee() const { return cad_2; }
    private:
    char *cad_2;
};
ostream& operator<<(ostream& os, const cadena& cad_3)
{
    os << cad_3.lee();
    return os;
}

2.h :

#include <iostream>
#include <cstdio>
#include <windows.h>
using namespace std;

int dev_cero( int cero = 0 );
int dev_cero( int cero)
{
	return cero;
}

void fin();
void fin()
{
	cout << "\n\n";
	dev_cero();
	system("pause");
}

1.cpp :

#include "2.h"
#include "3.h"
const int n = 5;
template<class T>
void Mostrar(tabla<T> &t);
int main()
{
    tabla<int> Tabla_int(n);
    tabla<cadena> Tabla_cad(n);
    char cad[20];
    for ( int i = 0 ; i < n ; i++ )
    {
        Tabla_int[i] = i;
        sprintf(cad,"Cad no.: %2d.",i);
        Tabla_cad[i] = cad;
    }
    Mostrar(Tabla_int);
    cout << "\n";
    Mostrar(Tabla_cad);
    fin();
}
template<class T>
void Mostrar(tabla<T> &t)
{
    for ( int i = 0 ; i < t.n_elem ; i++ )
    {
        cout << t[i] << "\n";
    }
}

Fin del código...

Saludos.


Más información sobre la lista de distribución Cconclase