Frage

Ich habe nur versucht, die Syntax der Anfänger Dinge zu lernen, und wie es funktioniert, wenn ich dieses kurze Stück Code in VS2008 machte. Der folgende Code funktioniert in Hinzufügen von Zahlen 1 bis 499, aber wenn ich hinzufügen 1 bis 500, die Compiler-Fehler aus mir geben:

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

Und ich habe mich nur gefragt, warum das so ist. Gibt es eine Grenze, wie viel Code der Compiler generieren oder etwas kann und es ist einfach passiert eine schöne runde Zahl von 500 für mich zu sein?

#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;
}
War es hilfreich?

Lösung

Ich gehe davon mit gcc (und durch Erweiterung g ++) die maximale Standardvorlage Rekursionstiefe 500 ist zumindest auf meinem Rechner ich es geschaffen, Ihre Probleme mit einer (etwas besser) Warnmeldung zu reproduzieren. Kompilieren loop<500>::sum funktionierte gut, aber versuchen loop<501>::sum gescheitert zu kompilieren.

Wenn Sie mit gcc (oder g ++) die Lösung ist es mit -ftemplate-depth-## zu kompilieren (wobei ## die maximal zulässige ist Tiefe).

So zum Beispiel zur Kompilierung main.cpp mit einer maximalen Vorlagenrekursionstiefengrenze Tiefe von 2000

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

oder konvertieren Sie den Code so aus:

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

(Aber ich werde den obigen Code zugeben, hilft nicht, Sie Metaprogrammierung lernen)

Andere Tipps

VC9 (VS2008) stürzt mit Zahlen> 499. Der Code selbst gültig ist und Compiler sind sogar zu stoppen Kompilation erlauben nach einer gewissen Menge an rekursive instantiations, einen diagnostischen geben. eine Internal Compiler Error jedoch (umgangssprachlich auch als ICE ) ist sicherlich kein schönes Diagnose.

Ein ICE ist immer ein Fehler des Compilers. Es könnte durch einen Fehler im Code verursacht werden, auch, aber wenn das der Fall ist, dann wird der Compiler eine richtige Diagnose für diesen Fehler nicht zeigen. Wenn der Fehler reproduzierbar ist, sollten Sie einen Fehlerbericht an den Compiler Anbieter einreichen, damit sie ihre Fehler beheben.

Wenn eine solche Fehlerberichterstattung (hier oder anderswo) Sie sollten nie Version den genauen Compiler nicht zur Verfügung stellen Sie verwendet.

Suchen Sie im Ausgabefenster:

  

c: \ projects \ cpptemp3 \ cpptemp3.cpp (9):
  fatal error C1001: Ein interner Fehler   hat in dem Compiler aufgetreten.       (Compiler-Datei 'msc1.cpp' Zeile 1411)        Um dieses Problem zu umgehen, versuchen Sie zu vereinfachen oder um das Programm zu ändern   in der Nähe der Orte aufgelistet oben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top