我正在编写一个非常简单的模板类,使用元编程来计算编译时的总和,如下所示:
#include <iostream>
using namespace std;
template<int N>
class Sum
{
public:
enum {value = N + Sum<N-1>::value };
};
template<>
class Sum<0>
{
public:
enum {value = 0};
};
int main()
{
cout << Sum<501>::value << endl;
}
有趣的是:
- 当我打印 Sum<500> 及以下时,它工作正常
当涉及 Sum<501> 时,编译失败:
sum.cpp:9: 从
Sum<500>' sum.cpp:9: instantiated from
Sum<501>' 实例化 sum.cpp:22: 从这里实例化sum.cpp:9:错误:不完整的类型
Sum<1>' used in nested name specifier sum.cpp:9: error: enumerator value for
值'不是整数常量Sum<501>会报Sum<1>的错误,Sum<502>会报Sum<2>的错误,差总是2,在我看来编译器有500的限制资源。
对此有任何想法吗?他们是打破这个限制的方法吗?
谢谢。
编辑:
谢谢大家,重点不在于算法,而在于编译器的限制——我知道有一种简单的方法可以得到总和:)
编辑2:
- 使用 gcc 4.6 +,错误信息更有帮助
sum.cpp:9:14: 错误: 模板实例化深度超过最大值 1024 (使用 -ftemplate-depth= 增加最大值) 实例化'class Sum<1>' sum.cpp:9:14: 从'Sum 递归实例化<1024>' sum.cpp:9:14: 从 'Sum<1025>' 实例化 sum.cpp:22:22: 从这里实例化
所以是的,使用 ftemplate-depth 是正确的方法。但是在 Windows 中呢?VC9.0 的上限是 499,似乎没有设置模板深度的选项,请参见此处