我尝试编写一个函数,该函数会回调大小为 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 编译时出现错误
fatal error C1202: recursive type or function dependency context too complex
我该如何解决这个问题?
最佳答案
模板内部存在无限递归。 即使您知道 else block 不会在运行时被调用,但在编译时,编译器需要无休止地知道哪些代码会进入 else block 。
例如,您可以考虑将 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;
关于c++ - C1202 : recursive type or function dependency context too complex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67038822/