Во время работы над собственным итератором стирания типов я столкнулся с проблемой, когда компилятор (MSVC10) потерпел крах с переполнением стека в этом коде:
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;
}
Очевидно, я удалил все, что мог, где ошибка остается. (Ориентировочный код состоял из 780+ строк). Удаление оставшихся параметров шаблона приводит к компиляции кода.
Полное сообщение об ошибке:
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 прекрасно компилирует . Я слышал, что MSVC неправильно реализовал двухфазный поиск, что кажется уместным, но не объясняет, почему он компилируется, когда я удаляю строку, которая заставляет from
наследовать от base
. Может кто-нибудь научить меня, почему MSVC10 не скомпилирует это? Что я сделал, что мне следует избегать?