我只是想学的东西初学者的语法,以及如何当我做这个代码的短位在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;
}
有帮助吗?

解决方案

我假定用gcc(通过扩展克++)的默认最大模板递归深度是500至少我的机器上我管理重现您的问题与(稍好)警告信息。编译loop<500>::sum工作得很好,但尝试编译loop<501>::sum失败。

如果你正在使用gcc(或g ++)的溶液与-ftemplate-depth-##编译它(其中##是最大允许深度)。

因此,例如,编译main.cpp与2000的最大模板递归深度

g++ -ftemplate-depth-2000 main.cpp

或者代码转换成这样:

template < int b >
struct loop {
    enum { sum = (b*(b+1))/2 };
};

(但我承认上面的代码并不能帮助您了解模板元编程)

其他提示

VC9(VS2008)与数字崩溃> 499.代码本身是有效的,编译器甚至被允许停止编译的一定量的递归实例化后,得到诊断。然而,一个内部编译器错误(俗称也称为 ICE )当然不是一个很好的诊断。

这是ICE始终是编译器的一个错误。这可能是由错误的代码导致的,太多,但如果是这样的话,那么编译器无法显示该错误一个适当的诊断。如果错误重复发生,你应该提交错误报告,编译器供应商,这样他们就可以解决他们的错误。

当报告这样的错误(在这里或其他地方),你应该从来都不能提供您使用的确切编译器版本。

查找在输出窗口:

  

C:\项目\ cpptemp3 \ cpptemp3.cpp(9):结果   致命错误C1001:内部错误   发生在编译器。       (编译器文件msc1.cpp',行1411)       要解决此问题,请尝试简化或更改程序   近上面列出的位置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top