[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