Domanda

stavo solo cercando di imparare la sintassi delle cose principianti, e come ha funzionato quando stavo facendo questo breve pezzo di codice in VS2008. Il codice di seguito opere ad aggiungere numeri da 1 a 499, ma se aggiungo 1 a 500, i bug del compilatore fuori avermi dato:

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

E mi stavo chiedendo perché. C'è qualche limite alla quantità di codice del compilatore in grado di generare o qualcosa e si è capitato di essere un bel numero tondo di 500 per me?

#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;
}
È stato utile?

Soluzione

I assumere con gcc (e per estensione g ++) la profondità massima di default modello di ricorsione è 500 come almeno sulla mia macchina sono riuscito a riprodurre i vostri problemi con una (leggermente migliore) messaggio di avviso. Compilazione loop<500>::sum ha funzionato bene, ma cercando di compilare loop<501>::sum non riuscita.

Se si utilizza gcc (o g ++) la soluzione è quella di compilarlo con -ftemplate-depth-## (dove ## è la profondità massima consentita).

Così, per esempio, per main.cpp compilazione con una profondità massima di ricorsione modello del 2000

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

o convertire il codice a questo:

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

(Ma devo ammettere il codice di cui sopra non ti consentiranno di apprendere template metaprogrammazione)

Altri suggerimenti

VC9 (VS2008) si blocca con i numeri> 499. Il codice stesso è valido e compilatori sono anche permesso di compilazione fermata dopo una certa quantità di istanze ricorsive, dando una diagnosi. Tuttavia, un Errore interno del compilatore (colloquialmente chiamato anche ICE ) di certo non è un bel diagnostico.

Un ICE è sempre un errore del compilatore. Potrebbe essere causato da un errore nel codice, anche, ma se questo è il caso, allora il compilatore non è riuscito a mostrare una corretta diagnosi per tale errore. Se l'errore è riproducibile, si dovrebbe presentare un bug report al produttore del compilatore, in modo che possano risolvere il loro errore.

Nella segnalazione di una tale errore (qui o altrove) non si dovrebbe mai non riescono a fornire l'esatta versione del compilatore è stato utilizzato.

Cercare nella finestra di output:

  

c: \ projects \ cpptemp3 \ cpptemp3.cpp (9):
  Errore irreversibile C1001: un errore interno   si è verificato nel compilatore.       (File del compilatore 'msc1.cpp', la linea 1411)        Per ovviare a questo problema, provare a semplificare o modificare il programma   vicino alle posizioni di cui sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top