代码之家  ›  专栏  ›  技术社区  ›  Museful

C1202:递归类型或函数依赖项上下文太复杂

  •  0
  • Museful  · 技术社区  · 5 年前

    我试着写一个函数,用大小为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:递归类型或函数依赖项上下文太复杂

    我该怎么解决这个问题?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Mikael Öhman    5 年前

    模板中有一个无限递归。 即使知道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;