2017-08-01 48 views
2
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 time_r = FUNC(网格,s_x ,X);

注:候选:模板INT FUNC(INT(&)[size_x] [size_y],INT,INT) INT FUNC(INT(&网格)[size_x] [size_y],INT s_x,INT X)

注意:模板参数推导/置换失败:

注:可变大小的数组类型 '长整型' 不是一个有效的模板参数 INT time_r = FUNC(网格,s_x,X);

如何正确运行?

回答

3

这是C99 VLA和C++模板的混合体。该模板需要一个在编译时已知边界的数组,而VLA仅在运行时知道其边界,所以这不起作用。

你可以去C方式并使用一个正常的(非模板)func,它需要一个指针和两个尺寸,或者将你的整个代码放到C++中,最好使用矢量。

0

问题是,MN是运行时值,并且C++无法正确处理具有动态大小的数组类型。您可以像以前那样创建一个基于堆栈的动态大小的数组,但这就是它。因为C++禁止使用int (*)[N]类型,所以无法传递指向二维数组的指针。

有几个解决方法,此:

  • 自己做索引,通过扁平1D阵列。使用指针数组,使所有指针数组本身都是1D数组。

  • 使用矢量的载体。

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