虽然我自己的类型擦除迭代器工作时,我遇到了一个问题,即编译器(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;
}
很显然,我已经删除了所有我能在错误仍然存在的地方。 (Origional代码是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 compiles it fine。我听说MSVC实现了两阶段查找错误,这似乎相关,但并不能解释为什么当我删除使from
继承base
的行时。 任何人都可以教我为什么MSVC10不会编译这个?我该做什么,我应该避免?
对于什么是值得的,GCC 4.6编译示例代码无故障(在Linux/Debian的/ SID/AMD64)。也许你可以切换到GCC(例如一些MinGW或Cygwin变种......)? – 2011-12-13 20:58:20
我实际上通过IDEOne做了大量的调试,但是我的命令行fu和linux很弱,所以Cygwin很害怕。尽管如此,我开始玩弄它。 – 2011-12-13 21:01:08
你有一个模板类继承自己?或者我看到这个错误? – AJG85 2011-12-13 21:17:07