Ayuda con plantillas y sobrecarga de operadores

Iniciado por 4rkn63l, 31 Mayo 2011, 20:13 PM

0 Miembros y 1 Visitante están viendo este tema.

4rkn63l

Buenas.

Estoy practicando el uso de plantillas pero me he quedado atascado al querer usar la sobrecarga de operadores. Basicamente se trata de una plantilla de clase que la implemento como una matriz bidimensional.
Código (cpp) [Seleccionar]

template <class T, int a, int b>
class matriz
{
/*
otros metodos
*/
matriz& operator+(const matriz& m);
matriz& operator*(const matriz& m);
};

Al crear una instancia de la plantilla desde el main, le paso el tipo y las dimensiones del array.
Código (cpp) [Seleccionar]

.
.
matriz<int,4,3> m;

Con la sobrecarga de operadores unarios no he tenido problema, sin embargo los binarios me han dado problema, en especial los operadores aritmeticos los cuales pareciera que no los estuviese declarados correctamente pues el compilador (DevC++) me tira errores de que no encuentra la funcion correcta solo candidatos, esto ocurre unicamente cuando intento por ejemplo multiplicar 2 instancias de la plantilla matriz de diferentes dimensiones, (sabemos que se puede hacer esto siempre y cuando la el numero de columnas de la matriz A sea igual al numero de filas de B.)
Código (cpp) [Seleccionar]

matriz<int,4,3> m1;
matriz<int,4,3> m2;
m1*m2 // -------> no hay error

sin embargo
Código (cpp) [Seleccionar]

matriz<int,4,3> m1;
matriz<int,3,5> m2;
m1*m2 // -------> hay error

No se supone que segun la declaracion de la plantilla puedo pasarle cualquiera dos numeros enteros?? Aunque las dimensiones no sean correctas para efectuar las operaciones, podria comprobarlo dentro del metodo del operador sobrecargado.

Hay algo que estoy haciendo mal? o es que tengo que implementarlo de otra forma?

Acermax

Es que ese uso que haces del template es muy extraño. Yo nunca lo había visto, de hecho no sabía ni que funcionase.
Como yo aprendí, y creo que es lo correcto, es que en el template simplemente le indiques el tipo de datos, luego las dimensiones de la matriz es cosa del constructor que tendrás que programar.

El error, creo, que es porque al hacer eso de las dimensiones en el template, te los detecta como datos de tipos distintos. Pero ya te digo, comento lo que imagino porque no sabia que se pudieran declarar templates así.

Puedes probar algo así

Código (cpp) [Seleccionar]

template <class T>
class matriz{
matriz ()
matriz(int filas, int columnas){
/* aquí haces tus cosas según como quieras implementarlo*/
};

4rkn63l

Muchas gracias Acermax funciona perfectamente de la forma que sugieres pasandole las dimensiones atraves del constructor. con respecto a la forma de declarar el template no es cosa mia xD. Y la verdad tiene mucha mas logica utilizar el constructor de esta forma.

muchas gracias!