J'essaye de calculer GCD, au moment de la compilation en utilisant la spécialisation partielle du template. Le code suivant fonctionne correctement avec clang3.8 mais pas avec gcc7.1. Avec GCC, il s'agit d'une instanciation de modèle récursif sans réaliser de cas de terminaison.Problème de spécialisation de template partiel C++ avec gcc
template <int N, int M>
struct GCD{
static const int value = (N>M)? GCD<N%M, M>::value : GCD<N, M%N>::value;
};
template <int M>
struct GCD<0, M>{
static const int value = M;
};
template <int M>
struct GCD<M, 0>{
static const int value = M;
};
int main()
{
static_assert(GCD<12,15>::value == 3, "Error");
}
Qui se comporte normalement?
Peut-être faire seulement une déclaration avant de la structure 'GCD' à deux arguments, avec la définition ci-dessous les spécialisations. Parce qu'au moment de la première définition, le compilateur ne connaît pas vraiment les deux spécialisations. Quel compilateur est correct, je ne le sais pas. –
Notez qu'en C++ 17, il y aura une fonction ['gcd'] (http://en.cppreference.com/w/cpp/numeric/gcd) dans l'en-tête' '. –
InternetAussie
Et vos maths ne fonctionnent pas ici. –