Mentre lavorava da sola cancellazione del tipo iteratore, mi sono imbattuto in un problema in cui il compilatore (MSVC10) si è schiantato con un overflow dello stack su questo codice:compilatore di overflow dello stack sul codice del modello
struct base {}; //In actual code, this is a template struct that holds data
template<class category, class valuetype>
struct any; //In actual code, this is abstract base struct
template<class basetype, class category, class valuetype>
struct from; //In actual code, this is function definitions of any
template<class valuetype>
struct any<void,valuetype>
{ void a() {} };
template<class category, class valuetype>
struct any
: public any<void,valuetype> //commenting this line makes it compile
{ void b() {} };
template<class basetype, class valuetype>
struct from<basetype,void,valuetype>
: public base //commenting out _either_ of these makes it compile
, public any<void,valuetype>
{ void c() {} };
int main() {
from<int, void, char> a;
a.a();
a.c();
any<int, char> b;
b.a();
b.b();
return 0;
}
Ovviamente, ho rimosso tutto ciò che posso dove rimane l'errore. (Il codice di orientamento era 780+ linee) La rimozione di eventuali parametri del modello rimanenti causa la compilazione del codice.
Il messaggio di errore completo è:
main.cpp(23): fatal error C1063: compiler limit : compiler stack overflow
main.cpp(20) : see reference to class template instantiation 'from<basetype,void,valuetype>' being compiled
IDEOne compiles it fine. Ho sentito che MSVC ha implementato la ricerca in due fasi errata, il che sembra rilevante, ma non spiega il motivo per cui viene compilato quando rimuovo la riga che rende ereditato lo from
da base
. Qualcuno può insegnarmi perché MSVC10 non lo compilerà? Che cosa ho fatto che dovrei evitare?
Per quello che vale, GCC 4.6 compila il codice di esempio, senza difficoltà (su Linux/Debian/Sid/AMD64). Forse potresti passare a GCC (ad esempio una variante MinGW o Cygwin ...)? –
In realtà ho eseguito una buona parte del debugging tramite IDEOne, ma la mia linea di comando-fu e linux sono deboli, quindi Cygwin sta intimidendo. Sto iniziando a giocarci comunque. –
Hai una classe template che eredita da se stessa? O sto leggendo questo sbagliato? – AJG85