1

型パラメーターとテンプレート テンプレート パラメーターを持つ、次のテンプレート クラスの型パラメーターを特化したいと考えています。

template <
    typename T,
    template <typename E> class Foo
> class Bar;

.template次の各スニペットの最後の行にand /or を追加および/または省略して、すべての順列を試しtypenameましたが、コンパイルされません。

1.)

template <
    template <typename E> class Foo
> class Bar<int, Foo<typename E>>;

2.)

template <
    template <typename E> class Foo
> class Bar<int, Foo.template <typename E>>;

3.)

template <
    template <typename E> class Foo
> class Bar<int, Foo<E>>;

4.)

template <
    template <typename E> class Foo
class Bar<int, Foo.template <E>>;

それらのどれも機能しないのはなぜですか?

該当する各スニペットの最後の行について:

  • クラス で使用される型であることがtypename明確にされていないか、またはこの構文はのクラス定義の本体内でのみ使用できますか?EFoo{}Bar
  • templateがテンプレートであることを明確にしないFooため、コンパイラが「より小さい」Foo <として解析するのを防ぎますか、またはこの構文はのクラス定義の本体内でのみ使用できますか?Foo{}Bar

どうすればこれを機能させることができますか?

4

2 に答える 2

3

クラス で使用される型であることがtypename明確にされていないか、またはこの構文はのクラス定義の本体内でのみ使用できますか?EFoo{}Bar

typenameは、テンプレート定義内で型を定義する場合 (classも使用できます)、または依存型 (テンプレート パラメーターに依存する型) にアクセスする場合にのみ使用されます。

詳細についてtemplateは (いつ使用されるかについても)、このスレッドを参照してください。

どうすればこれを機能させることができますか?

テンプレート テンプレート パラメーター内の型の名前は、実際には使用できません。形式としてあるだけです。代わりに、別のテンプレート パラメーターをメイン テンプレートに追加する必要があります。

template <
    template<typename> class Foo,
    typename E
> class Bar<int, Foo<E>> { ... };

さらに、これがテンプレートの特殊化である場合は、特殊化するためのプライマリ テンプレートが必要ですBarBar

template<typename T, typename U>
struct Bar;

template <
    template<typename> class Foo,
    typename E
> class Bar<int, Foo<E>> { ... };
于 2014-05-25T22:34:17.943 に答える
1

このような:

template <template <typename E> class Foo>
class Bar<int, Foo>
{
    // ...
};

目的を果たさないため、内部パラメーター name を省略することもできますE

于 2014-05-25T22:33:48.290 に答える