【问题标题】:How to do the template recursion in function call?如何在函数调用中进行模板递归?
【发布时间】:2017-08-01 07:06:35
【问题描述】:
template <size_t size_x, size_t size_y>

int func(int(&grid)[size_x][size_y], int s_x, int x)
{
    if (s_x == x)
        return 0;
    else {
        cout << grid[s_x][0] << " " << x << endl;
        s_x++;
        return func(grid, s_x, x);
    }
}

int main()
{
    int T;
    cin >> T;
    while (T > 0) {
        int M, N, x, y, s_x = 0, s_y = 0;
        cin >> M >> N;
        int grid[M][N] = {};
        cin >> x >> y;
        x--;
        y--;
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                cin >> grid[i][j];
            }
        }
        int time_r = func(grid, s_x, x);
        cout << time << endl;
        T--;
    }
    return 0;
}

我遇到的错误:

没有匹配函数调用‘func(int [M][N], int&, int&)’ int time_r=func(grid,s_x,x);

注意:候选:模板 int func(int (&)[size_x][size_y], int, int) int func(int (&grid)[size_x][size_y],int s_x, int x)

注意:模板参数扣除/替换失败:

注意:可变大小的数组类型“long int”不是有效的模板参数 int time_r=func(grid,s_x,x);

如何正确运行?

【问题讨论】:

    标签: c++ recursion


    【解决方案1】:

    这是 C99 VLA 和 C++ 模板的奇怪组合。模板需要一个在编译时知道边界的数组,而 VLA 只在运行时知道它的边界,所以这不起作用。

    您可以采用 C 方式并使用普通(非模板)func,它需要一个指针和两种大小,或者您可以扔掉整个代码并采用 C++ 方式,最好使用向量。

    【讨论】:

      【解决方案2】:

      问题是,M 和N 是运行时值,C++ 无法正确处理动态大小的数组类型。您可以像以前一样创建基于堆栈的动态大小数组,仅此而已。您不能将指针传递给您的二维数组,因为 C++ 禁止您使用类型 int (*)[N]。

      有一些解决方法:

      • 自己做索引,传递一个扁平的一维数组。

      • 使用指针数组,使所有指针数组本身都是一维数组。

      • 使用向量的向量。

      • 回退到 C,它可以轻松处理自 C99 以来的运行时数组大小。

      【讨论】:

        猜你喜欢
        • 2010-09-20
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多