<分区>
我正在尝试模板元编程并编写一个函数来计算 base^re 的幂,例如 3^2=9
template<int N>
int Tpow(int base){return N==0?1:base*Tpow<N-1>(base);}
int main()
{
int r3=Tpow<3>(2);
return 0;
}
只有几行,但它使 gcc 和 clang 都崩溃了。我哪里错了? 谢谢。
<分区>
我正在尝试模板元编程并编写一个函数来计算 base^re 的幂,例如 3^2=9
template<int N>
int Tpow(int base){return N==0?1:base*Tpow<N-1>(base);}
int main()
{
int r3=Tpow<3>(2);
return 0;
}
只有几行,但它使 gcc 和 clang 都崩溃了。我哪里错了? 谢谢。
最佳答案
解决方案:您必须专门针对 N 等于 0 的模板。例如:
template<>
int Tpow<0>(int base){return 1;}
现在您有了这个,您还可以像这样优化您的原始模板:
template<int N>
int Tpow(int base){return base*Tpow<N-1>(base);}
因为您知道您处理 N 等于 0 的情况。
解释:您的编译器基本上是这样做的:它看到
int r3=Tpow<3>(2);
并为 3 创建一个函数作为模板变量,就像这样
int Tpow_3(int base){return 3==0?1:base*Tpow<3-1>(base);}
然后它需要为 2 创建一个函数作为模板变量,就像这样
int Tpow_2(int base){return 2==0?1:base*Tpow<2-1>(base);}
这会一直持续下去,因为编译器还不关心你的 0==0?...
。
关于C++ 为什么我的模板扩展导致编译器堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42341990/