当我用VS2008编写这一小段代码时,我只是想学习初学者的语法,以及它是如何工作的。下面的代码可以将数字1到499相加,但是如果我将1到500相加,编译器会给出错误:
fatal error C1001: An internal error has occurred in the compiler.
我想知道为什么会这样。编译器可以生成的代码量是否有限制,或者是什么,对我来说恰好是一个很好的整数500?
#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;
}发布于 2010-04-14 23:04:17
我假设对于gcc (以及扩展的g++),默认的最大模板递归深度是500,因为至少在我的机器上,我设法用一条(稍微好一点)的警告消息重现了你的问题。编译loop<500>::sum运行良好,但尝试编译loop<501>::sum失败。
如果您使用的是gcc (或g++),那么解决方案是使用-ftemplate-depth-##编译它(其中##是允许的最大深度)。
例如,要编译最大模板递归深度为2000的main.cpp
g++ -ftemplate-depth-2000 main.cpp或者将代码转换为:
template < int b >
struct loop {
enum { sum = (b*(b+1))/2 };
};(但我承认上面的代码并不能帮助你学习模板元编程)
发布于 2010-04-14 23:05:52
数字> 499的VC9 (VS2008)崩溃。代码本身是有效的,编译器甚至被允许在一定数量的递归实例化之后停止编译,从而给出诊断。然而,内部编译器错误(俗称ICE)肯定不是一个很好的诊断方法。
ICE总是编译器的错误。这也可能是由代码中的错误引起的,但如果是这样的话,编译器就无法显示对该错误的正确诊断。如果错误是可重现的,您应该向编译器供应商提交错误报告,以便他们可以修复错误。
当报告这样的错误时(在这里或其他地方),你应该提供你使用的确切的编译器版本。
发布于 2010-04-14 23:20:12
查看输出窗口:
c:\projects\cpptemp3\cpptemp3.cpp(9):
致命错误C1001:编译器中发生内部错误。(编译器文件'msc1.cpp',第1411行)要解决此问题,请尝试简化或更改上面列出的位置附近的程序。
https://stackoverflow.com/questions/2638409
复制相似问题