我正在尝试模板元编程,并编写了一个函数来计算基^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。我哪里弄错了?谢谢。
发布于 2017-02-20 10:27:26
解决方案:,您必须为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?...,所以这种情况会持续下去。
发布于 2017-02-20 10:28:58
编译器必须编译整个函数体:它不能依赖三元条件只编译一方。因此在递归上没有块。
(使用constexpr of C++11也没有帮助)。
要解决这个问题,您需要专门处理N=0的函数。
https://stackoverflow.com/questions/42341990
复制相似问题