gpt4 book ai didi

c++ - 刚刚向 TMPing 介绍自己,发现了一个怪癖

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:49 25 4
gpt4 key购买 nike

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

fatal error C1001:编译器发生内部错误。

我只是想知道为什么会这样。编译器可以生成多少代码或其他东西是否有一些限制,它恰好是一个很好的整数 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(以及扩展 g++)默认的最大模板递归深度是 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 };
};

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

关于c++ - 刚刚向 TMPing 介绍自己,发现了一个怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2638409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com