¿Cómo gestionas una matriz en una clase de plantilla (con la longitud de la matriz como parámetro) que tiene llamadas de función recursiva?
Este es un extracto de mi código:
#include <iostream>
using namespace std;
class Exception
{ };
template <int row_length="">
class IntContainer
{
private:
int mem[row_length];
public:
IntContainer()
{
for (int i = 0; i < row_length; i++) mem[i] = i;
}
~IntContainer() {}
int get_det()
{
if (row_length == 2) return mem[0] + mem[1];
else if (row_length == 1) return mem[0];
else return get_cofactor();
}
int get_cofactor()
{
if (row_length == 1) throw Exception();
IntContainer<row_length -="" 1=""> temp;
return temp.get_det();
}
};
int main()
{
IntContainer<5> ic1;
cout << ic1.get_det();
}
Al compilarlo con g++, obtengo el siguiente error:
error: el tamaño '18446744073709551615' del array excede el tamaño máximo del objeto '9223372036854775807'
11| int mem[row_length];
¿Qué debo hacer para manejar el array sin un error de compilación (lo manejo correctamente en las funciones)?
davy.ai
El mensaje de error sugiere que el valor de
row_length
es demasiado grande para que el compilador maneje.row_length
es un parámetro de plantilla para la claseIntContainer
y determina el tamaño del arraymem
.Para manejar el array sin error de compilación, puedes reducir el valor de
row_length
o cambiar la implementación deIntContainer
para asignar memoria de forma dinámica en lugar de utilizar un array estático.Para reducir el valor de
row_length
, puedes modificar la funciónmain
para instanciar la claseIntContainer
con un valor más pequeño, de la siguiente manera:Alternativamente, puedes cambiar
IntContainer
para usar memoria asignada de forma dinámica. Aquí tienes un ejemplo de implementación:Con esta implementación,
mem
se asigna dinámicamente utilizando el operadornew
y el operadordelete
se utiliza para liberar la memoria cuando se destruye el objeto. Esto te permite gestionar el tamaño del array de forma dinámica en tiempo de ejecución, en lugar de depender de un parámetro de plantilla.