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

标签 c++ templates meta expand

<分区>

我正在尝试模板元编程并编写一个函数来计算 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/

相关文章:

c++ - gcc 返回嵌套类错误

c++ - 重载可变模板成员函数和可变模板函数

seo - Google 没有为我的多语言网站编制索引

c++ - 访问命名空间中 operator<< 中的私有(private)类

c++ - Isapi 过滤器到 apache 模块

c++ - 为什么调用 abort 方法?

c++ - 制作 vtkOBJWriter 时遇到问题

c++ - 根据模板方法中不同类型的不同代码路径

css - 如何使用 html5-boilerplate 创建一个仅限桌面的网站?

angularjs - Facebook linting scraper 如何工作,它对我的​​网站有何期望?