いくつかの新しいc++11機能に慣れるために、テンプレート化された数学行列クラスを作成しています。基本的な宣言は次のとおりです。
template <typename Type, int kNumRows, int kNumCols>
class Matrix { ... };
このクラスには、その小行列式の1つを返すメンバー関数があります(これは後でNxN行列の行列式を計算するために使用されます)。
Matrix<Type, kNumRows - 1, kNumCols - 1> minor(const int row, const int col) {
static_assert(kNumRows > 2, "");
static_assert(kNumCols > 2, "");
...
}
次に、正方行列の行列式を計算するための非メンバー関数を作成しました。
template <typename Type, int kSize>
Type determinant(const Matrix<Type, kSize, kSize>& matrix) {
switch (kSize) {
case 2:
return 0; // For now unimportant
case 3:
// Recursively call the determinant function on a minor matrix
return determinant(matrix.minor(0, 0));
}
...
}
main()で、3x3行列を作成し、それを呼び出しますdeterminant
。これはコンパイルされません。コンパイラは事実上ケース3に移行し、マイナーマトリックスを作成して呼び出しdeterminant
ます。次に、case 3
再びステップインし、1x1マイナーを作成しようとしてstatic_assertになります。
質問は簡単です:私はここで何かが欠けていますか?このようなテンプレート関数を再帰的に呼び出すことは単に許可されていませんか?これはコンパイラの障害ですか(私はそれを疑っています)?
完全を期すために:私はClang++を使用しています。