Ver Mensaje Individual
  #3 (permalink)  
Antiguo 15/10/2014, 04:09
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: comparar dos tipos de datos y crear uno nuevo eligiendo el mayor

Cita:
Iniciado por alexpglez98 Ver Mensaje
Mi duda sería como hacerlo. He hecho ya mi propio código que compara dos tipos de datos, lo que me falla es a la hora de crear el nuevo dato, me dice que hay declaraciones en conflicto:
Te da conflicto porque las variables que declaras dentro de los case tienen todas, por decirlo de alguna forma, el mismo ámbito y colisionan entre ellas. Puedes evitar el problema simplemente poniendo el contenido de los case entre llaves:

Código C++:
Ver original
  1. case 's':
  2. {
  3.   Matrix<short> result(I, J);
  4.   break;
  5. }
  6.  
  7. case 't':
  8. {
  9.   Matrix<unsigned short> result(I, J); // declaración en conflicto
  10.   break;
  11. }

En cualquier caso has de saber que los objetos que estás creando dentro del switch se eliminan al salir de dicho switch, por lo que el if que tienes después te va a dar error porque no va a encontrar una variable que se llamen "result".

Por otro lado, tienes que tener en cuenta que los templates son tratados de forma especial por el compilador. En tiempo de compilación el compilador chequea los diferentes usos de los templates y crea una versión específica para cada uso. Esto quiere decir que un programa compilado no tiene templates sino funciones y clases sobrecargadas (todas las especializaciones que se usen en el programa).

El rollo que te he contado implica que el tipo de retorno, "Matrix<T_2>" va a tener que estar determinado en el momento de llamar a la función y su repercusión más inmediata es que no vas a poder retornar dentro de la misma especialización un Matrix<int> y un Matrix<char> porque son tipos diferentes... y no puedes elegir al gusto el tipo a retornar dentro de la función porque la elección hay que hacerla bastante antes.

Dicho de otra forma, "result" tiene que estar declarado forzosamente tal que:

Código C++:
Ver original
  1. template<class T>
  2. template<typename T_1, typename T_2>
  3. Matrix<T_2> Matrix<T>::operator + (const Matrix<T_1> &m_2)
  4. {
  5.   Matrix<T_2> result( I, J );
  6.  
  7.   // ...
  8.  
  9.   return result;
  10. }

Los tipos de I y J no aparecen en tu código. Si son variables globales te aconsejo evitar su uso. Si son constantes (en C++ te aconsejo usar static const en vez de define para declarar constantes) entonces olvida lo que te he dicho.

Por otro lado, y ya para terminar, el bucle que calcula la suma de las dos matrices anteriores puede que necesite una pequeña ayuda con las conversiones de datos para evitar warnings durante la compilación... quizás algo del tipo:

Código C++:
Ver original
  1. for(int i=0; i<I; i++)
  2. {
  3.     for(int j=0; j<J; j++)
  4.     {
  5.         result.value(i,j) = static_cast<T_2>( this->value(i,j) ) + static_cast<T_2>( m_2.value(i,j) );
  6.     }
  7. }

Un saludo.