Je suis en train d'écrire une classe de matrice mathématique pour me familiariser avec les nouvelles fonctionnalités de c++11, la déclaration de base est la suivante :
template <typename Type, int kNumRows, int kNumCols>
class Matrix { ... };
La classe dispose d'une fonction membre qui renvoie l'un de ses mineurs (qui est ensuite utilisé pour calculer le déterminant des matrices NxN).
Matrix<Type, kNumRows - 1, kNumCols - 1> minor(const int row, const int col) {
static_assert(kNumRows > 2, "");
static_assert(kNumCols > 2, "");
...
}
J'ai ensuite créé une fonction non membre pour calculer le déterminant de n'importe quelle matrice carrée :
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));
}
...
}
Dans main(), je crée une matrice 3x3 et j'appelle determinant
sur celui-ci. Il ne sera pas compilé. Le compilateur passe effectivement au cas 3, en créant une matrice mineure et en appelant determinant
sur celui-ci. Il entre ensuite dans case 3
à nouveau, ce qui entraîne un static_assert en essayant de créer un mineur 1x1.
La question est simple : ai-je raté quelque chose ? Est-ce que le fait d'appeler une fonction template comme celle-ci de manière récursive n'est tout simplement pas autorisé ? S'agit-il d'une erreur du compilateur (j'en doute) ?
Par souci d'exhaustivité : J'utilise Clang++.