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;
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top