2
// p1: some value
// nt: native type
template<int p1, typename nt>
struct A {};

// pt: pointer to type i.e. int*
// tA: a specialization of A
template<typename pt, typename tA>
struct B1 {};

// pt: pointer to type i.e. int*
// tA: a specialization of A
template<typename pt, typename tA>
struct B2 {};

// tB: specialization of B?
// tA: specialization of A
template<typename tB, typename tA>
struct C {};

// now i want to create a C partial specialization where:
//  A<some_value, native_type>
//  B?<char*, A<some_value, native_type> >

template< template<typename, typename> class B, int p1, typename nt >
struct C< B<char*, A<p1, nt> >, A<p1, nt> > {};

int main()
{
    C< B1, A<10, int> > c;
}

上記のコードを clang でコンパイルすると、次のエラーが発生します。

error: use of class template B1 requires template arguments
   C< B1, A<10, int> > c;
      ^~

エラーを理解しました。修正するにB1B1<char*, A<10, int> >. コンパイラは、これらのパラメーターの値を、最も一致する特殊化から差し引く必要がありますか?

4

1 に答える 1

4

コンパイラは、これらのパラメーターの値を、最も一致する特殊化から差し引く必要がありますか?

私はあなたの質問を理解しているかどうかわかりませんが、もしそうなら答えは「いいえ」です。B1コンパイラは、完全にインスタンス化された型 (この場合は の特殊化) をクラス テンプレート (この場合は ) の生の名前から推測する方法を知りませんB1。のテンプレート引数を指定する必要がありますB1

プライマリ テンプレートに必要な引数を指定した後で、プライマリ テンプレートの特殊化が選択されることに注意してください。この場合、プライマリ テンプレートは 2 つのパラメーターを受け入れ、2 つの型引数を指定する必要があります。

Bのインスタンスである型パラメーターを一致させるために、テンプレートの特殊化でテンプレート テンプレート パラメーターを使用しているという事実は、プライマリ テンプレートのパラメーターが 2 つの (完全にインスタンス化された)Bであるという事実を変更しません。

于 2013-05-20T13:57:11.190 に答える