[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