【发布时间】:2021-02-14 21:32:53
【问题描述】:
这是我的代码:
template<int x>
struct factorial
{
enum :unsigned long long{ value = x * factorial<x - 1>::value };
};
template<>
struct factorial<1>
{
enum :unsigned long long{ value = 1 };
};
有什么区别
struct factorial<1>
{
enum :unsigned long long{ value = 1 };
};
和
struct factorial<0>
{
enum :unsigned long long{ value = 1 };
};
如果我把0换成1有什么不同? 我在我的机器和 cppinsight 上尝试了它们,没有区别和工作发现,但是 cw 说:
fatal error: recursive template instantiation exceeded maximum depth of 1024
enum :unsigned long long{ value = x * factorial<x - 1>::value };
^
main.cpp:8:43: note: in instantiation of template class 'factorial<-1024>' requested here
main.cpp:8:43: note: in instantiation of template class 'factorial<-1023>' requested here
main.cpp:8:43: note: in instantiation of...
问题来自这里:https://www.codewars.com/kata/5a74a94f5084d72c710000de/discuss
【问题讨论】:
-
"但是 cw 说" 什么是 cw?请提供您的问题的minimal reproducible example。
-
拿一张纸并在那里执行递归。不是 C++ 问题,而是算法问题。
-
如果将
0替换为1,然后用0实例化模板,则没有什么可以阻止它遇到所有负数。如果您使用数字> 0对其进行实例化,它应该仍然可以正常工作。 -
顺便说一句,0 的阶乘应该是
1,而不是0 * ..。