2016-01-22 8 views
10

この質問では、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だけでパラメータリストに浮いているで

+2

部分的な特殊化のテンプレート引数は、明示的に指定されていません。 –

答えて

6

しかし専門で、何を一致させる必要があることはvariabledテンプレートのリストではなく、パターンではありません。

C<T(A...), S> 

A...が区切られているので簡単です。

ので、テンプレートの特殊化では、パラメータのリストは、パターンで表示されるだけで、シンボルの在庫、いくつかのスカラーおよびいくつかのパラメータパック、です。

+0

しかし、これは本当に最初のケースでは 'T = a'、' A ... =(b、c、d、e) '、' S = f'と一致しない理由を説明していません –

+0

@TristanBrindleそれが標準で指定されている方法なので。 [\ [temp.param \]§14.1p11](http://eel.is/c++draft/temp.param#11):*プライマリクラステンプレートまたはエイリアステンプレートのテンプレートパラメータがテンプレートの場合パラメータテンプレートの 最後のテンプレートパラメータになります*関数テンプレート__iff__の例外はパック*の後のテンプレートパラメータ*を導き出すことができます*、私はクラステンプレートの部分的な特殊化のために別の例外があると思います。 – melak47

+0

@TristanBrindle:それは本当です、私はそれを説明しませんでした。私が説明したのは、2番目の例はあいまいではないということです。 2番目の例は2つのパラメータパックを持つことができます: 'template class C {}; 'プライマリテンプレート' template 'は理論的にも曖昧ではありません。しかし、私は答えを書き直すだろう。 – rici