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

[SOLUCIONADO] Problemas con los template de clase

Estas en el tema de Problemas con los template de clase en el foro de C/C++ en Foros del Web. Buenas estaba haciendo un programa para afianzar un poco C++ y se me ocurrio crear una plantilla que trabajara con la STL vector para hacer ...
  #1 (permalink)  
Antiguo 06/03/2013, 13:07
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 2 meses
Puntos: 0
Exclamación Problemas con los template de clase

Buenas estaba haciendo un programa para afianzar un poco C++ y se me ocurrio crear una plantilla que trabajara con la STL vector para hacer matrices, y que ademas tuviera una plantilla para que pudiese meter con el mismo codigo distintos tipos de parametros, es decir, hacer matrices de enteros, flotantes, doubles, chars etc.

Todo va bien, me compila los .o de el archivo matriz.cpp y del archivo main.cpp pero cuando voy a compilar ambos me tira el siguiente error:

Código:
main.cpp: En la función ‘int main()’:
main.cpp:22:11: error: solicitud por el miembro ‘setFilas’ en ‘miMatriz’, el cual es del tipo ‘math::Matriz<int>()’ que no es clase
main.cpp:23:11: error: solicitud por el miembro ‘setColumnas’ en ‘miMatriz’, el cual es del tipo ‘math::Matriz<int>()’ que no es clase
main.cpp:26:17: error: se usa ‘template<class TYPE> class math::Matriz’ sin parámetros de plantilla
main.cpp:31:11: error: solicitud por el miembro ‘mostrarDatos’ en ‘miMatriz’, el cual es del tipo ‘math::Matriz<int>()’ que no es clase
He estado mirando por todos lados y me tiene loco, no se donde esta el error, os dejo los trozos del codigo afectado de los tres archivos (no meto todo por que es muy largo, de todas formas si lo necesitan diganmelo y lo meto).

main.cpp
Código:
#include <iostream>
#include <cstdlib>
#include <vector>
#include "matriz.hpp"

using namespace std;
using namespace math;

int main()
{
	Matriz< int > miMatriz();
	int nFilas, nColumnas;

	cout << "Introduzca el numero de filas: ";
	cin >> nFilas;
	cout << endl;

	cout << "Introduzca el numero de columnas: ";
	cin >> nColumnas;
	cout << endl;

	miMatriz.setFilas(nFilas);
	miMatriz.setColumnas(nColumnas);

	cout << "Rellenando los datos: " << endl;
	miMatriz.math::Matriz::leerDatos();

	system("clear");

	cout << "Su matriz es: " << endl;
	miMatriz.mostrarDatos();
	return 0;
}

matriz.hpp:
Código:
#ifndef _CLASS_MATRIZ_HPP
#define _CLASS_MATRIZ_HPP
#define BANDERAS 2

#include <vector>
#include <bitset>

using namespace std;

/** @class Matriz
	 @brief Almacena una matriz de n filas y m columnas y proporciona
	 los operando necesarios para realizar operaciones de suma, resta
	 multiplicacion, calculo de la matriz inversa etc.
**/
namespace math
{
   template < typename TYPE >
   class Matriz
   {
   private:
      vector<vector<TYPE> > _matriz; //Matriz de elementos con la STL
      TYPE _mayor; //Elemento más grande de la matriz
      TYPE _menor; //Elemento más pequeño de la matriz
      int _anchoNumero; //Longitud del numero más grande
      int _precision; //Si el tipo de argumento es de punto flotante, entonces este valor indica la precision de salida

      /** @brief el parametro _estado son un conjunto de banderas que indican si la matriz esta vacia, o si contiene
                 errores **/
      bitset<BANDERAS> _estado;

      /** @brief Metodo que pone a uno el bit de estado empty **/
      void setEmpty();

      /** @brief Metodo que pone a cero el bit de estado empty **/
      void resetEmpty();

      /** @brief Metodo que pone a uno el bit de estado de error de la matriz **/
      void setFail();

      /** @brief Metodo que pone a 0 el bit de estado de error de la matriz **/
      void resetFail();

      /** @brief Actualiza el mayor elemento de la matriz 
          @return Un valor true si se actualizo el valor, y false en caso contrario.**/
      bool updateMayor(TYPE elemento);

      /** @brief Actualiza el menor elemento de la matriz
          @return Un valor true si se actualizo el valor, y false en caso contrario. **/
      bool updateMenor(TYPE elemento);

      /** @brief Actualiza el campo _anchoNumero **/
      void updateAnchoNumero();

      /** @brief Devuelve la longitud del numero más grande de la matriz, sin contar con los decimales
      **/
      int getAnchoNumero();

      /** @brief Fuerza una busqueda del menor elemento de la matriz, y lo inserta como menor **/
      void buscarMenor();

      /** @brief Fuerza una busqueda del mayor elemento de la matriz, y lo inserta como mayor **/
      void buscarMayor();

   public:
      /** @brief Constructor vacio que inicializa la matriz a empty **/
      Matriz();

      /** @brief Constructor que inicializa la matriz a cero con el numero de filas y columnas
                 indicado
      **/
      Matriz(const int &nFilas,const int &nColumnas);

      /** @brief Constructor que inicializa la matriz con el parametro que se le indique **/
      Matriz(const int &nFilas,const int &nColumnas,const TYPE &valor);

      /** @brief Constructor de copia **/
      Matriz(const Matriz<TYPE> &m);

      /** @brief Metodo que devuelve el bit de estado empty **/
      bool isEmpty() const;

      /** @brief Metodo que devuelve el bit de estado de empty **/
      bool getFail() const;

      /** @brief Devuelve el numero de filas de la matriz **/
      int getFilas() const;

      /** @brief Devuelve el numero de columnas de la matriz **/
      int getColumnas() const;

      /** @brief Devuelve el mayor elemento de la matriz almacenado **/
      TYPE getMayor() const;

      /** @brief Devuelve el menor elemento de la matriz almacenado **/
      TYPE getMenor() const;

      /** @brief Devuelve el elemento situado en la posicion indicada de la matriz **/
      TYPE getElemento(const int &fila, const int &columna) const;

      /** @brief Devuelve la precision de salida de los datos de la matriz **/
      int getPrecision() const;

      /** @brief Cambia el numero de filas de la matriz **/
      bool setFilas(const int &nFilas);

      /** @brief Cambia el numero de columnas de la matriz **/
      bool setColumnas(const int &nColumnas);

      /** @brief Introducce un elemento en la posicion indicada **/
      bool setElemento(const int &fila, const int &columna,const TYPE &elemento);

      /** @brief Cambia la precision de salida de los datos de la matriz **/
      bool setPrecision(const int &precision);

      /** @brief Rellena completamente una matriz **/
      bool leerDatos();

      /** @brief Muestra todos los datos de la matriz, si es que son correctos **/
      void mostrarDatos() const;
   };
}
#endif
matriz.cpp:
Código:
 ....
        template< typename TYPE >
	Matriz<TYPE>::Matriz()
	{
		setFilas(0);
		setColumnas(0);
		setEmpty();
	}
 ....

template<typename TYPE>
	bool Matriz<TYPE>::setFilas(const int &nFilas)
	{
		bool resultado;

		if(nFilas < 0)
		{
			resultado = false;
		}
		else
		{
			resultado = _matriz.resize(nFilas);
		}

		return resultado;
	}

	template< typename TYPE >
	bool Matriz< TYPE >::setColumnas(const int &nColumnas)
	{
		bool resultado;

		if(nColumnas < 0)
		{
			resultado = false;
		}
		else
		{
			resultado = true;
			for(int i = 0; i < getFilas(); i++)
			{
				_matriz[i].resize(nColumnas);
			}
		}

		return resultado;
	}
Se que es largo de leer, pero si me pueden ayudar le estaría muy agradecido.
  #2 (permalink)  
Antiguo 07/03/2013, 15:56
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Problemas con los template de clase

Vale hoy después de trabajar me puse ha hacer un programa pequeñito a ver si sabia como programar una plantilla de una clase y me di cuenta de que no puedo separar en dos ficheros lo que viene a ser el prototipo de la clase y la definición de los métodos, es decir, que para que el compilador acepte tengo que programarlo todo en el hpp.

Haciendo esos cambios el programa compila perfectamente, aunque el no tener un archivo .hpp para la definición de la clase y otro .cpp para los métodos me hace sentir un poco mal (ya que estudie que eso no se debía de hacer).

Si alguien conoce alguna otra solución se lo agradezco mucho, y si no, de momento dejo como valida esta solución.
  #3 (permalink)  
Antiguo 07/03/2013, 15:59
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Problemas con los template de clase

Bueno al main.cpp tuve que cambiarle una linea, que se quedo aquí mal puesta por los nervios de no saber donde estaba el error que me daba el compilador.

Cambie la linea
Código:
miMatriz.math::Matriz::leerDatos()
por esta otra
Código:
miMatriz.leerDatos();

Etiquetas: clase, int, matriz, programa, template
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 20:14.