Ich versuche, GCD zu kompilieren Zeit mit Vorlage teilweise Spezialisierung zu berechnen. Der folgende Code funktioniert gut mit clang3.8, aber nicht mit gcc7.1. Mit GCC geht es in rekursive Template-Instanziierung, ohne Abschlussfall zu realisieren.C++ partielle Vorlage Spezialisierung Problem mit 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");
}
Wer verhält sich hier vernünftig?
Vielleicht nur eine Vorwärtsdeklaration der Zwei-Argument 'GCD' Struktur, mit der Definition unterhalb der Spezialisierungen. Denn zum Zeitpunkt der ersten Definition weiß der Compiler nichts über die beiden Spezialisierungen. Welcher Compiler korrekt ist, weiß ich nicht. –
Beachten Sie, dass es in C++ 17 eine '' gcd''- (http://en.cppreference.com/w/cpp/numeric/gcd) Funktion im Header ' 'gibt. –
InternetAussie
Und deine Mathematik funktioniert hier nicht. –