我正在编写一个模板化的数学矩阵类来适应一些新的 c++11 特性,基本声明如下:
template <typename Type, int kNumRows, int kNumCols>
class Matrix { ... };
该类有一个成员函数来返回其次要之一(稍后用于计算 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++。