类型&模板类中类型参数的部分特化模板模板参数

时间:2014-05-25 22:30:42

标签: c++ templates partial-specialization template-templates

我想专门化以下模板类的type参数,它具有type参数和模板模板参数:

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的{​​{1}}类定义中使用?

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:3)

  

typename澄清E不是Foo类使用的类型,或者此语法只能在{} Bar typename内使用班级定义?

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

template

有关详细信息(甚至关于何时使用template < template<typename> class Foo, typename E > class Bar<int, Foo<E>> { ... }; ),请参阅this thread

  

我怎样才能让它发挥作用?

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

Bar

此外,如果这是模板Bar的特化,那么template<typename T, typename U> struct Bar; template < template<typename> class Foo, typename E > class Bar<int, Foo<E>> { ... }; 需要一个主模板专门化:

{{1}}

答案 1 :(得分:1)

像这样:

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

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