Question

Je voulais juste essayer d'apprendre la syntaxe des choses débutants, et comment il a travaillé quand je faisais ce court peu de code dans VS2008. Le code ci-dessous fonctionne en ajoutant les chiffres 1 à 499, mais si j'ajoute 1 à 500, les bugs du compilateur en me donnant:

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

Et je me demandais pourquoi. Y at-il une limite à la quantité de code, le compilateur peut générer ou quelque chose et il vient de se passer d'être un beau chiffre rond de 500 pour moi?

#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;
}
Était-ce utile?

La solution

Je suppose avec gcc (et par extension g ++) la profondeur de récursivité modèle maximum par défaut est 500 au moins sur ma machine, j'ai réussi à reproduire vos problèmes avec un message d'avertissement (un peu mieux). loop<500>::sum a bien fonctionné Compiler mais en essayant de compiler loop<501>::sum a échoué.

Si vous utilisez gcc (ou g ++), la solution est de le compiler avec -ftemplate-depth-## (où ## est la profondeur maximale autorisée).

Ainsi, par exemple pour compiler main.cpp avec une profondeur de récursivité modèle maximum de 2000

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

Ou convertir le code à ceci:

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

(Mais je dois admettre que le code ci-dessus ne vous aide pas en apprendre davantage sur modèle metaprogramming)

Autres conseils

VC9 (VS2008) plante avec des chiffres> 499. Le code lui-même est valide et compilateurs sont même autorisés à la compilation d'arrêt après une certaine quantité de instanciations récursifs, ce qui donne un diagnostic. Cependant, un erreur du compilateur interne (aussi appelé familièrement ICE ) est certainement pas un bon diagnostic.

Un ICE est toujours une erreur du compilateur. Il peut être causé par une erreur dans le code aussi, mais si tel est le cas, le compilateur n'a pas démontré un diagnostic approprié pour cette erreur. Si l'erreur est reproductible, vous devez soumettre un rapport de bogue au fournisseur du compilateur, afin qu'ils puissent corriger leur erreur.

Lors de la déclaration d'une telle erreur (ici ou ailleurs) vous ne devriez jamais manquer de fournir la version exacte du compilateur que vous avez utilisé.

Regardez dans la fenêtre de sortie:

  

c: \ projects \ cpptemp3 \ cpptemp3.cpp (9):
  Erreur irrécupérable C1001: Une erreur interne   a eu lieu dans le compilateur.       (Fichier de compilateur 'msc1.cpp', ligne 1411)        Pour contourner ce problème, essayez de simplifier ou de modifier le programme   près des endroits indiqués ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top