首页 > 解决方案 > 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:递归类型或函数依赖上下文太复杂

我怎样才能解决这个问题?

标签: c++algorithmcompiler-errorsc++17

解决方案


模板内部存在无限递归。即使您知道 else 块不会在运行时被调用,在编译时,编译器也需要知道哪些代码会无休止地进入 else 块。

例如,您可以考虑创建n一个模板参数,并实现 0 案例,就像 MSVC 在他们的页面上针对此错误消息解释的那样:

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/fatal-error-c1202?view=msvc-160

供参考上面的链接:

// 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;

推荐阅读