2017-08-01 49 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以來的運行時數組大小。