Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Plantillas de métodos en clases genéricas

Estas en el tema de Plantillas de métodos en clases genéricas en el foro de C/C++ en Foros del Web. Mi duda sería si se pueden hacer plantillas de métodos dentro de clases que son a su vez plantillas, tipo: Código: template<class C> class L ...
  #1 (permalink)  
Antiguo 13/10/2014, 14:27
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 6 meses
Puntos: 0
Pregunta Plantillas de métodos en clases genéricas

Mi duda sería si se pueden hacer plantillas de métodos dentro de clases que son a su vez plantillas, tipo:
Código:
template<class C>
class L
{
    private:
    C x;
    public:
    template<typename A, typename B>
    C function(A,B);

    ....

}

template<class C>
template<typename A, typename B>
C L<C>::function(A y, B z)
{
    x=y;
    return x*z;
}
Gracias.
  #2 (permalink)  
Antiguo 13/10/2014, 15:13
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Plantillas de métodos en clases genéricas

Sí, perfectamente; tal como lo has escrito.

No olvides definir la clase template y su función function() en el .h

Luego, puede probar con algo así:

Código C++:
Ver original
  1. #include <iostream>
  2. #include "classC.h"
  3.  
  4. int main()
  5. {
  6.     L<int> objeto_l;
  7.     int a = 5;
  8.     int b = 6;
  9.     int z;
  10.  
  11.     z = objeto_l.function(a, b);
  12.  
  13.     std::cout << "z = " << z << std::endl;
  14.     return 0;
  15. }

Lareto :)
  #3 (permalink)  
Antiguo 13/10/2014, 16:08
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Plantillas de métodos en clases genéricas

Pues así lo puse más o menos. Antes me lanzaba errores por no escribirlo bien, ahora me lanza otros...
Código:
template <class T>
class Matrix {
    private:
        T **matrix;
        int I;
        int J;
        int N;
    public:
        Matrix(int, int, T *p=0);
        T value(int, int);

        template<typename T_1>
        Matrix<T> operator + (const Matrix<T_1> &m_2);
};

template<class T>
Matrix<T>::Matrix(int I, int J, T *p)   //Constructor, reserva memoria y le asigna una matriz que 
{                                                             //almacena la clase
    this->I = I;
    this->J = J;
    N=I*J;
    matrix = new T*[I];

    for (int i = 0; i < I; i++) {
        matrix[i] = new T[J];
    }

    if(p!=0){
        for(int i=0; i< I; i++){
            for( int j=0; j< J; j++){
                matrix[i][j]=p[j+i*J];
            }
        }
    }
}

template<class T>                  //devuelve el dato de la matriz en la posicion i j
T Matrix<T>::value(int i, int j)
{
    return matrix[i][j];
}

template<class T>
template<typename T_1>
Matrix<T> Matrix<T>::operator + (const Matrix<T_1> &m_2) //funcion que me falla
{
    Matrix<T> result(I, J);
    for(int i=0; i<I; i++)
    {
        for(int j=0; j<J; j++)
        {
            result.matrix[i][j]=matrix[i][j]+m_2.matrix[i][j];  //justo aqui
        }
    }
    return result;

}

#include <iostream>

#define data_1 int
#define data_2 int

#define a 5
#define b 2

int main(void){
    data_1 c[a][b]={{0,0},{2,7},{0,0},{4,9},{0,0}};
    data_2 d[a][b]={{1,6},{2,7},{3,8},{4,9},{5,10}};
    Matrix<data_1> M(a, b);
    Matrix<data_1> C(a, b, &c[0][0]);
    Matrix<data_2> D(a, b, &d[0][0]);
    M=C+D;
   
    for(int i=0; i<a; i++){                // imprime la matriz
        for(int j=0; j<b; j++){
            std::cout << M.value(i,j) << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
Así por ejemplo me va, si hago diferente data_1 de data_2, me da errores de que el segundo dato es privado..
  #4 (permalink)  
Antiguo 13/10/2014, 17:27
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Plantillas de métodos en clases genéricas

Hola; y bien, me alegra saber que la primera de las cuestiones haya quedado resuelta.

Ésta de ahora es una cuestión bien diferente, pero puedo comentarte algunas cosas que veo:

-- en operator+ (), en la línea
Cita:
result.matrix[i][j]=matrix[i][j]+m_2.matrix[i][j]; //justo aqui
el error se debe a que estás queriendo acceder a un miembro que efectivamente has declarado como private; y, esa es la idea de la función pública value(), ¿verdad?

-- Otro error es que si a la función operator+ () le pasas una referencia constante, vas a necesitar agregar el calificador const a las funciones miembros que no modifican los estados:
T value(int, int) const;

-- Hay otras cosillas que tienen más que ver con el diseño, pero no es el caso.

-- (Y ah, por cierto, no te olvides de liberar la memoria asignada en el destructor)

Saludos!
Lareto :)
  #5 (permalink)  
Antiguo 14/10/2014, 09:34
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Plantillas de métodos en clases genéricas

Muchas gracias, me va genial ahora. Intentaré andar con más cuidado de no cometer errores tan tontos y desastrosos.

Etiquetas: clase, clases, plantillas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:07.