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

标签 c++ templates metaprogramming c1001

当我在 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/

相关文章:

python - 将 boost::python::object 转换为(非常量)左值

groovy - Groovy 对象可以像带参数的函数一样被调用吗?

c++ - C++ 概念和 C++ 模板约束有什么区别?

c++ - 类中的内联函数

c++ - 如何停止 gSOAP 操作

c++ - 通过元编程选择函数

c++ - "empty"可变模板特化的地址

c++ - 使用元编程和可变参数模板填充静态模板化数组

c++ - 寻找提供类似于 Google Go channel 功能的 C 或 C++ 库

c++ - VC++ 资源编译器 (RC) 选项/n ...?