繁体   English   中英

具有类型和模板模板参数的模板类中类型参数的部分专业化

[英]Partial specialization of type parameter in template class with type & template template parameters

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

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澄清E是由类使用的类型Foo ,或可在此语法只有内使用{}身体的Bar的类定义?
  • template是否无法阐明Foo是模板,因此阻止编译器解析Foo <因为Foo “小于”,或者该语法只能在Bar的类定义的{}主体内使用吗?

我该如何工作?

typename澄清E是由类使用的类型Foo ,或可在此语法只有内使用{}身体的Bar的类定义?

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

有关更多信息(甚至有关何时使用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 ,因为它没有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM