Pracując nad własnym typ wymazywania iterator, pobiegłem do problemu gdzie kompilator (MSVC10) rozbił się z przepełnienie stosu na ten kod:kompilator przepełnienie stosu na kodzie szablonu
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;
}
Oczywiście mam usunąłem wszystko, co mogę, tam, gdzie pozostanie błąd. (Oryginalnym kodem było 780 wierszy) Usunięcie pozostałych parametrów szablonu powoduje kompilację kodu.
Pełny komunikat o błędzie:
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. Słyszałem, że MSVC zaimplementował dwuetapowe wyszukiwanie błędne, co wydaje się odpowiednie, ale nie wyjaśnia, dlaczego kompiluje się po usunięciu linii, która powoduje, że from
dziedziczy po base
. Czy ktoś może mnie nauczyć, dlaczego MSVC10 nie skompiluje tego? Co zrobiłem, czego powinienem unikać?
Na co warto, GCC 4.6 kompiluje kod przykładowy bez kłopotów (na Linux/Debian/Sid/AMD64). Być może mógłbyś przejść na GCC (np. Jakiś wariant MinGW lub Cygwin ...)? –
Prawdę mówiąc, wykonałem sporo debugowania za pośrednictwem IDEOne, ale moje polecenia-lin-fu i linux są słabe, więc Cygwin jest onieśmielający. Zaczynam się z tym bawić. –
Masz klasę szablonów, która dziedziczy z samej siebie? Czy mogę to źle odczytać? – AJG85