1

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

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

我尝试了在以下每个片段的最后一行添加和/或省略.template和的所有排列,但没有一个编译: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澄清E是 class 使用的类型Foo,还是只能在类定义的{}主体中使用此语法Bar
  • 没有template澄清Foo是一个模板,因此阻止编译器解析Foo <Foo“小于”,或者这种语法只能在类定义的{}主体中使用Bar

我怎样才能让它工作?

4

2 回答 2

3

没有typename澄清E是 class 使用的类型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>> { ... };
于 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 回答