コンパイル時にテンプレートの部分的な特殊化を使用してGCDを計算しようとしています。 以下のコードは、clang3.8では正常に動作しますが、gcc7.1では正常に動作しません。 GCCでは、終了ケースを認識せずに再帰的なテンプレートのインスタンス化が行われます。gccのC++部分テンプレートの特殊化問題
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");
}
ここでは誰が行動していますか?正確
恐らく、2つの引数をとる 'GCD'構造体の前方宣言だけを行います。最初の定義の時点でコンパイラは2つの特殊化について実際には分かっていないためです。どのコンパイラが正しいのか分かりません。 –
C++ 17では、 ''ヘッダに['gcd'](http://en.cppreference.com/w/cpp/numeric/gcd)関数が存在することに注意してください。 –
InternetAussie
あなたの数学はここでは機能しません。 –