関数テンプレートを使用して、次元行列の行列式を計算しました。
template <int dimension>
double get_cofactor(double A[dimension][dimension],
double temp[dimension-1][dimension-1],
int p, int q)
{
int i = 0, j = 0;
for (int row = 0; row < dimension; row++)
{
for (int col = 0; col < dimension; col++)
{
if (row != p && col != q)
{
temp[i][j++] = A[row][col];
if (j == dimension - 1)
{
j = 0;
i++;
}
}
}
}
}
template <int dimension>
double determinant(double A[dimension][dimension])
{
double ret = 0.0;
double temp[dimension-1][dimension-1] ={ 0.0 };
int sign = 1;
for (int i=0; i<dimension; ++i) {
get_cofactor<dimension>(A, temp, 0, i);
ret += sign * A[0][i] * determinant<dimension-1>(temp);
sign = -sign;
} //end of for
return ret;
}
関数テンプレートの次の特殊化を使用して、再帰を終了します。
template <>
double determinant<1>(double A[][1])
{
return A[0][0];
}
しかし、特殊化はコンパイルを通過できません。1 つのエラーが発生しました。
エラー C2912: 明示的な特殊化 'double determinant<1>(double [][1])' は関数テンプレートの特殊化ではありません
どうしたの?どうすれば終了できますか?
2017/6/23 コード修正、GCCで動くようになりました!