首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++为什么我的模板扩展会导致编译器堆栈溢出?

C++为什么我的模板扩展会导致编译器堆栈溢出?
EN

Stack Overflow用户
提问于 2017-02-20 10:23:39
回答 2查看 68关注 0票数 0

我正在尝试模板元编程,并编写了一个函数来计算基^re的幂(类似于3^2=9 )。

代码语言:javascript
复制
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。我哪里弄错了?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-20 10:27:26

解决方案:,您必须为N= 0专门化模板。比如:

代码语言:javascript
复制
template<>
int Tpow<0>(int base){return 1;}

现在,您可以这样优化您的原始模板,如下所示:

代码语言:javascript
复制
template<int N>
int Tpow(int base){return base*Tpow<N-1>(base);}

因为你知道你处理N等于0的情况。

解释:您的编译器基本上就是这样做的:它看到

代码语言:javascript
复制
int r3=Tpow<3>(2);

并为3创建一个函数作为模板变量,如下所示

代码语言:javascript
复制
int Tpow_3(int base){return 3==0?1:base*Tpow<3-1>(base);}

然后,它需要为2创建一个函数作为模板变量,如下所示

代码语言:javascript
复制
int Tpow_2(int base){return 2==0?1:base*Tpow<2-1>(base);}

因为编译器还不关心您的0==0?...,所以这种情况会持续下去。

票数 3
EN

Stack Overflow用户

发布于 2017-02-20 10:28:58

编译器必须编译整个函数体:它不能依赖三元条件只编译一方。因此在递归上没有块。

(使用constexpr of C++11也没有帮助)。

要解决这个问题,您需要专门处理N=0的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42341990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档