[C con Clase] Error copilando un ejemplo del curso de C++ con Clase
Steven Davidson
srd4121 en njit.edu
Vie Abr 1 08:09:23 CEST 2011
Hola aJ,
On 3/31/2011 5:18 PM, aJ wrote:
> 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 :
>
Veamos el código fuente.
> 3.h :
>
> #include<iostream>
> #include<cstdio>
No veo que necesites este fichero de cabecera; especialmente, si vas a
usar <iostream>.
> #include<cstring>
> #include<string.h>
No necesitas este fichero de cabecera, ya que incluiste <cstring> y
además, <string.h> no existe en C++.
> 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>&);
He aquí el problema. Tendrías que indicar que 'Mostrar()' es una
función-plantilla. Para esto, escribimos:
friend void Mostrar<T>( tabla<T> & );
porque se trata de una plantilla basada en el parámetro T. Sin embargo,
tenemos el problema de que esta función-plantilla debe existir
previamente. Por lo tanto, escribimos antes de la clase 'tabla':
template< typename T >
void Mostrar( tabla<T> & );
No obstante, tenemos otro problema, ya que 'tabla' no ha sido definida
aún. Podemos resolver este problema adelantando su declaración. Al
final, tendremos lo siguiente:
template< typename T >
class tabla;
template< typename T >
void Mostrar( tabla<T> & );
template< typename T >
class tabla
{
...
friend void Mostrar<T>( tabla<T> & );
...
};
Espero haber aclarado la duda.
Steven
Más información sobre la lista de distribución Cconclase