¿Plantilla de metaprogramación de límites de recursión?
Estoy escribiendo una clase de plantilla muy simple utilizando Metaprogramming para calcular la suma en tiempo de compilación, como se muestra a continuación:
#include <iostream>
using namespace std;
template<int N>
class Sum
{
public:
enum {value = N + Sum<N-1>::value };
};
template<>
class Sum<0>
{
public:
enum {value = 0};
};
int main()
{
cout << Sum<501>::value << endl;
}
Lo interesante es:
Cuando imprimo Suma <500> y debajo, funciona bienCuando se trata de Suma <501>, la compilación falló con:
sum.cpp: 9: instanciado desdeSum<500>' sum.cpp:9: instantiated from
Suma <501> 'sum.cpp: 22: instanciada desde aquí
sum.cpp: 9: error: tipo incompletoSum<1>' used in nested name specifier sum.cpp:9: error: enumerator value for
valor 'no constante entero
Suma <501> reportará error de Suma <1>, Suma <502> reportará error de Suma <2>, la diferencia es siempre 2, me parece que el compilador tiene un límite de recursos de 500.
¿Alguna idea sobre esto? ¿Y es su manera de romper estos límites?
Gracias.
Editar:
Gracias, no se trata del algoritmo, sino de la limitación del compilador. Sé que hay una manera fácil de obtener la suma :)
Edit2:
Use gcc 4.6 +, el mensaje de error es mucho más útilsum.cpp: 9: 14: error: la profundidad de creación de instancias de la plantilla excede el máximo de 1024 (use -ftemplate-depth = para aumentar el máximo) instanciación 'class Sum <1>' sum.cpp: 9: 14: instanciada de forma recursiva desde 'Sum <1024> 'sum.cpp: 9: 14: instanciado de' Suma <1025> 'sum.cpp: 22: 22: instanciado desde aquí
así que sí, usar ftemplate-depth es la manera correcta. Pero ¿qué tal en las ventanas? los límites ascendentes para VC9.0 son 499, y parece que no hay opción para establecer la profundidad de la plantilla, veaaquí