2017-08-01 28 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型、&をint型)' int型time_r = FUNC(グリッド、s_xを、バツ);

注:候補:テンプレートINTのFUNC(INT(&)size_x] [size_y]、INT、INT) INT FUNC(INT(&グリッド)size_x] [size_y]、INT s_x、INT X)

注:テンプレート引数控除/置換が失敗しました:

をノート:可変サイズの配列タイプ 'long int型' は有効なテンプレート引数ではありません int型time_r = FUNC(グリッド、s_x、x)は、

正しく実行するにはどうすればよいですか?

答えて

3

これは、C99のVLAsとC++のテンプレートを奇妙に組み合わせたものです。テンプレートはコンパイル時に既知の境界を持つ配列を必要としますが、VLAは実行時にその境界を知っているだけなので、これは機能しません。

普通の(テンプレートではない)funcのポインタと2つのサイズを使用するか、コード全体をスローしてC++の方法、好ましくはベクトルを使用することができます。

0

MNは実行時の値であり、C++では動的なサイズの配列型を正しく処理できません。動的なサイズのスタックベースの配列を作成することは許可されていますが、それはそれです。 C++ではタイプint (*)[N]の使用を禁じているため、2D配列へのポインタを渡すことはできません。

はこれにいくつかの回避策があります。

  • はフラット1D-配列を渡し、インデックスを自分で行います。

  • ポインタ配列を使用すると、すべてのポインタ配列自体が1D配列になります。

  • ベクターベクターを使用してください。

  • C99以降の実行時配列サイズを簡単に処理できるCへのフォールバック。

関連する問題