この質問では、my previous questionを参照します。その質問にはバリデーショナルテンプレート、パラメータパックとそのパラメータリストの曖昧性について
、私は以下のが有効でないことが判明:
template<typename T, typename... A, typename S>
class C { };
ためです。その引数は常になければならないので、
クラステンプレートの[それは有効なコードではありません]パラメータパックが最後になければ、常にあいまいさになり、残りのテンプレートパラメータをスローします。もちろん、理にかなっていると私はそれを得た
。
その後、別のアプローチとして、特殊化を必要とする以下は、提案されている:それを提案した1のおかげで、
template<typename F, typename S>
class C;
template<typename T, typename... A, typename S>
class C<T(A...), S> { };
は実際に、動作しているようですので。
とにかく、私は理解できないのは、前のコードが有効ではないのにこれが有効なコードである理由です。
前の解決策と同じ曖昧さがありますか?なぜ、コンパイラはその場合にあいまいさを解決しますか?
前の質問(この質問の冒頭のリンクを参照してください)によれば、変数の部分はすべてのパラメータを最後までスラップアップするはずなので、このコードも有効ではないはずです。
私は間違っていますが、もちろん私の推論では間違っていますか?クラステンプレート、中
template<typename T, typename... A, typename S>
と一致する必要がC<a,b,c,d,e,f>
将来のテンプレート引数リスト... Aだけでパラメータリストに浮いているで
部分的な特殊化のテンプレート引数は、明示的に指定されていません。 –