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.