3

不思議に思っている-私は次の関数を書いた

template <class T, size_t N>
T* asFlatArray (T arr[][N])
{
    // some code
}

そしてそれを次のように呼び出します

asFlatArray(myArray); // where myArray is int myArray[some_size][sime_size];

コンパイルはエラーなしで実行されます。しかし、「arr」を次のように参照に変更すると

template <class T, size_t N>
T* asFlatArray (T (&arr)[][N])
{
    // some code
}

エラーが発生します:

parameter ‘arr’ includes reference to array of unknown bound ‘T [][N]’

私はそれを修正する方法を知っています

template <class T, size_t Rows, size_t Columns>
T* asFlatArray (T (&arr)[Rows][Columns])

しかし、なぜそれが起こっているのか理解できませんか?

4

2 に答える 2

5

根本的な問題は、最初の関数テンプレートが

template <class T, size_t N>
T* asFlatArray (T (*arr)[N]) {}

したがって、計算する次元はありません。配列へのポインター、または配列へのポインターに減衰する可能性のあるものと一致します。したがって、2D 配列とも一致します。

2 番目の例については、型への参照またはポインターをT[][N]関数パラメーターにすることはできず、コンパイラ エラーが発生します。もちろん、欠落しているディメンションにテンプレート パラメータを追加することもできます。

template <class T, size_t N, size_t M>
T* asFlatArray(T (&arr)[N][M]) {}
于 2014-10-12T18:08:23.380 に答える