首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在向TMPing自我介绍的时候,我遇到了一个怪事

在向TMPing自我介绍的时候,我遇到了一个怪事
EN

Stack Overflow用户
提问于 2010-04-14 22:55:33
回答 3查看 330关注 0票数 4

当我用VS2008编写这一小段代码时,我只是想学习初学者的语法,以及它是如何工作的。下面的代码可以将数字1到499相加,但是如果我将1到500相加,编译器会给出错误:

fatal error C1001: An internal error has occurred in the compiler.

我想知道为什么会这样。编译器可以生成的代码量是否有限制,或者是什么,对我来说恰好是一个很好的整数500?

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-14 23:04:17

我假设对于gcc (以及扩展的g++),默认的最大模板递归深度是500,因为至少在我的机器上,我设法用一条(稍微好一点)的警告消息重现了你的问题。编译loop<500>::sum运行良好,但尝试编译loop<501>::sum失败。

如果您使用的是gcc (或g++),那么解决方案是使用-ftemplate-depth-##编译它(其中##是允许的最大深度)。

例如,要编译最大模板递归深度为2000的main.cpp

代码语言:javascript
复制
g++ -ftemplate-depth-2000 main.cpp

或者将代码转换为:

代码语言:javascript
复制
template < int b >
struct loop {
    enum { sum = (b*(b+1))/2 };
};

(但我承认上面的代码并不能帮助你学习模板元编程)

票数 5
EN

Stack Overflow用户

发布于 2010-04-14 23:05:52

数字> 499的VC9 (VS2008)崩溃。代码本身是有效的,编译器甚至被允许在一定数量的递归实例化之后停止编译,从而给出诊断。然而,内部编译器错误(俗称ICE)肯定不是一个很好的诊断方法。

ICE总是编译器的错误。这也可能是由代码中的错误引起的,但如果是这样的话,编译器就无法显示对该错误的正确诊断。如果错误是可重现的,您应该向编译器供应商提交错误报告,以便他们可以修复错误。

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

票数 5
EN

Stack Overflow用户

发布于 2010-04-14 23:20:12

查看输出窗口:

c:\projects\cpptemp3\cpptemp3.cpp(9):

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2638409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档