Sólo presentándome a TMPing, y me encontré con una peculiaridad
-
26-09-2019 - |
Pregunta
Yo sólo estaba tratando de aprender la sintaxis de las cosas principiantes, y cómo funcionaba cuando estaba haciendo este breve fragmento de código en VS2008. El código siguiente funciona en la adición de números del 1 al 499, pero si añado 1 a 500, los errores de compilación a cabo darme:
fatal error C1001: An internal error has occurred in the compiler.
Y me estaba preguntando por qué es así. ¿Hay algún límite a la cantidad de código que el compilador puede generar o algo así y que acaba de pasar a ser un número redondo de 500 para mí?
#include <iostream>
using namespace std;
template < int b >
struct loop {
enum { sum = loop< b - 1 >::sum + b };
};
template <>
struct loop< 0 > {
enum { sum = 0 };
};
int main() {
cout << "Adding the numbers from 1 to 499 = " << loop< 499 >::sum << endl;
return 0;
}
Solución
Asumo con gcc (y, por extensión, g ++) el valor por defecto profundidad máxima de plantilla recursividad es 500
como al menos en mi máquina me las arreglé para reproducir sus problemas con un mensaje de advertencia (ligeramente mejor). Compilar loop<500>::sum
funcionaba bien, pero tratando de recopilar loop<501>::sum
falló.
Si está utilizando gcc (o g ++) la solución es compilar con -ftemplate-depth-##
(donde ## es la profundidad máxima permitida).
Así, por ejemplo a main.cpp
de compilación con una profundidad máxima plantilla de recursión de 2000
g++ -ftemplate-depth-2000 main.cpp
O convertir el código a la siguiente:
template < int b >
struct loop {
enum { sum = (b*(b+1))/2 };
};
(Pero tengo que admitir que el código anterior no le ayuda a aprender acerca de metaprogramming plantilla)
Otros consejos
VC9 (VS2008) se bloquea con los números> 499. El código en sí mismo es válido y compiladores incluso se permite a la compilación parada después de una cierta cantidad de instanciaciones recursivas, dando un diagnóstico. Sin embargo, un Error interno de compilador (coloquialmente también llamado ICE ) ciertamente no es un buen diagnóstico.
Una ICE es siempre un error del compilador. Podría ser causado por un error en el código, también, pero si ese es el caso, entonces el compilador no logró mostrar un diagnóstico adecuado para ese error. Si el error es reproducible, debe enviar un informe de error al proveedor del compilador, por lo que puede corregir su error.
Al informar sobre este tipo de error (aquí o en otro lugar) nunca se debe dejar de ofrecer la versión del compilador exacta que utilizó.
Buscar en la ventana de salida:
c: \ proyectos \ cpptemp3 \ cpptemp3.cpp (9):
C1001 error fatal: un error interno se ha producido en el compilador. (Archivo del compilador 'msc1.cpp', línea 1411) Para solucionar este problema, intente simplificar o cambiar el programa cerca de los lugares indicados anteriormente.