[C con Clase] Problema creacion de clase matriz con plantilla en C++
Programante
programante en gmail.com
Sab Dic 26 20:59:10 CET 2009
Rafael Enriquez Herrador escribió:
> Hola a tod en s,
>
> Esta es la primera vez que escribo a la lista, por lo tanto me
> gustaría dar la enhorabuena a todos aquellos/as que intervienen en
> ella de cualquier forma.
Hola Rafael, bienvenido a la lista.
Da gusto encontrarse con alguien que tiene que hacer un ejercicio y en
vez de esperar que se lo hagamos por la cara, lo ha hecho él solito y
sólo pregunta los problemas que le surgen :)
>
> El problema es que al compilar me da el siguiente error:
>
> /$ g++ -I. -g3 main.cpp -o matrix
>
> In file included from main.cpp:8:
> matrix.h: In copy constructor ‘storage::Matrix<Type>::Matrix(const
> storage::Matrix<Type>&) [with Type = float]’:
> main.cpp:34: instantiated from here
> matrix.h:89: error: pasar ‘const storage::Matrix<float>’ como el
> argumento ‘this’ de ‘unsigned int storage::Matrix<Type>::getNRows()
> [with Type = float]’ descarta a los calificadores
> (....)/
> La verdad es que estoy totalmente bloqueado ya que soy nuevo en esto
> de la programación de clases con plantillas en C++. Agradecería
> muchísimo si alguien pudiese orientarme de dónde puede estar el fallo
> y a que puede deberse.
>
> Un saludo y muchas gracias por adelantado.
Tu problema es que tienes código como este (quito la template para mayor
claridad, pues no afecta al problema):
Matrix::Matrix(const Matrix &M){
_nRows = M.getNRows();
_nCols = M.getNCols();
}
Estás pasando M como una matriz constante, pero los métodos getNRows() y
getNCols() no son constantes. En lo que respecta al compilador, podrían
estar modificando la matriz (imáginate que se llamara
poner_a_cero_y_devolver_numero_de_filas() ).
Tienes definidos estos métodos como:
/**Gets the number of rows
*/
inline unsigned int getNRows();
/**Gets the number of columns
*/
inline unsigned int getNCols();
Para indicar al compilador que estos métodos no modifican la matriz
(decirle que el this es const dentro de esa función) tienes que añadir
const al final. Así:
/**Gets the number of rows
*/
inline unsigned int getNRows() const;
/**Gets the number of columns
*/
inline unsigned int getNCols() const;
Con este cambio no debería darte más fallos. Aparte de getNRows() y
getNCols() tienes también que arreglar get() y, aunque no te está dando
ningún error, conceptualmente creo que
debería añadirse también al operator+
Felices Navidades a todos
Más información sobre la lista de distribución Cconclase