c++ - C1202:递归类型或函数依赖上下文太复杂
问题描述
我试图编写一个函数,该函数会在每个大小为 n 的排列时回调:
template<typename F>
void permutationsCallback(int n, F f) {
if (n == 1) {
f(std::vector<int>{0});
}
else {
permutationsCallback(n - 1, [n, &f](std::vector<int> p) {
p.emplace_back(n - 1);
f(p);
while (--p.back() >= 0) {
for (int k = 0; k < n - 1; k++) {
p[k] += p[k] == p.back();
}
f(p);
}
});
}
}
(例如我想permutationsCallback(3, f)
打电话给f({0,1,2}
, f({0,2,1})
, f({1,2,0})
, f({1,0,2})
, f({2,0,1})
, f({2,1,0})
。)
但是在使用 MCSV 编译时出现错误
致命错误 C1202:递归类型或函数依赖上下文太复杂
我怎样才能解决这个问题?
解决方案
模板内部存在无限递归。即使您知道 else 块不会在运行时被调用,在编译时,编译器也需要知道哪些代码会无休止地进入 else 块。
例如,您可以考虑创建n
一个模板参数,并实现 0 案例,就像 MSVC 在他们的页面上针对此错误消息解释的那样:
供参考上面的链接:
// C1202b.cpp
// compile with: /c
template<int n>
class Factorial : public Factorial<n-1> {
public:
operator int () {
return Factorial <n-1>::operator int () * n;
}
};
template <>
class Factorial<0> {
public:
operator int () {
return 1;
}
};
Factorial<7> facSeven;
推荐阅读
- mysql - 选择具有不同日期间隔的相同列
- sql - 如何从与外部查询连接的 COUNT 子查询中设置列值?
- python - 熊猫查找日期频率
- mockito - 无法检查在 Mockito 中是否调用了间谍方法
- javascript - 如何将我的应用重定向到异步登录页面
- jquery - 如何从 Datepicker 类型的 var 中获取“getValue”值
- c# - 如何使用 Angular 7 将存储在 SQL Server 数据库中的文件作为 varbinary 类型下载?
- javascript - Typescript 类构造函数生成的代码顺序
- reactjs - 有没有没有拖动中心点的 React DND 库?
- r - R帮助-错误:如果`cols`是`vars()`列表,`rows`必须是`NULL`或`vars()`列表