Pergunta

Eu estava apenas tentando aprender a sintaxe das coisas iniciantes e como funcionava quando estava fazendo esse pequeno código no VS2008. O código abaixo funciona na adição de números 1 a 499, mas se eu adicionar 1 a 500, o compilador insere me dando:

fatal error C1001: An internal error has occurred in the compiler.

E eu estava me perguntando por que isso é. Existe algum limite para quanto código o compilador pode gerar ou algo assim e por acaso foi um bom número redondo de 500 para mim?

#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;
}
Foi útil?

Solução

Suponho com o GCC (e por extensão G ++), a profundidade de recursão máxima de modelo padrão padrão é 500 Como pelo menos na minha máquina, consegui reproduzir seus problemas com uma mensagem de aviso (um pouco melhor). Compilação loop<500>::sum funcionou bem, mas tentando compilar loop<501>::sum fracassado.

Se você estiver usando o GCC (ou G ++), a solução é compilá -lo com -ftemplate-depth-## (Onde ## é a profundidade máxima permitida).

Por exemplo, para compilar main.cpp com uma profundidade de recursão de modelo máxima de 2000

g++ -ftemplate-depth-2000 main.cpp

Ou converta o código para isso:

template < int b >
struct loop {
    enum { sum = (b*(b+1))/2 };
};

(Mas vou admitir que o código acima não ajuda você a aprender sobre o modelo metaprograma)

Outras dicas

VC9 (VS2008) trava com números> 499. O código em si é válido e os compiladores podem até interromper a compilação após uma certa quantidade de instanciações recursivas, dando um diagnóstico. No entanto, um Erro interno do compilador (coloquialmente também chamado GELO) Certamente não é um bom diagnóstico.

Um gelo é sempre um erro do compilador. Também pode ser causado por um erro no código, mas se for esse o caso, o compilador não mostrou um diagnóstico adequado para esse erro. Se o erro for reproduzível, você deve enviar um relatório de bug ao fornecedor do compilador, para que eles possam corrigir seu erro.

Ao relatar esse erro (aqui ou em outro lugar), você nunca deve deixar de fornecer a versão exata do compilador usada.

Olhe na janela de saída:

C: Projects cppTemp3 cpptemp3.cpp (9):
Erro fatal C1001: Ocorreu um erro interno no compilador. (arquivo do compilador 'msc1.cpp', linha 1411) Para contornar esse problema, tente simplificar ou alterar o programa próximo aos locais listados acima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top