使用类型和模板模板参数对模板类中的类型参数进行部分专用化

Partial specialization of type parameter in template class with type & template template parameters

本文关键字:类型参数 行部 专用 类型 参数      更新时间:2023-10-16

我想专门化下面模板类的类型参数,它有一个类型参数和一个模板模板参数:

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

我尝试了在以下每个代码片段的最后一行添加和/或省略.templatetypename的所有排列,但没有编译:

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的类定义的{}体内使用?

我怎样才能使它工作?

typename没有澄清E是类Foo使用的类型,或者这种语法只能在Bar类定义的{}体中使用?

typename仅在您在模板定义中定义类型(class也可以使用)或访问依赖类型(依赖于模板参数的类型)时使用。

有关更多信息(甚至关于何时使用template),请参阅此线程。

我怎样才能使它工作?

模板模板形参中类型的名称实际上不能使用。这只是一种形式。您必须在主模板中添加另一个模板参数:

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

而且,如果这是模板Bar的专门化,那么Bar需要一个主模板来专门化:

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

像这样:

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

您甚至可以省略内部参数名称E,因为它没有任何用途。