我想专门化以下模板类的type参数,它具有type参数和模板模板参数:
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
是Foo
类使用的类型,或者此语法只能在{}
Bar
template
内使用的课程定义?Foo
澄清Foo <
是一个模板,因此阻止编译器解析Foo
{}
“小于”,或者此语法只能是在Bar
的{{1}}类定义中使用?我怎样才能让它发挥作用?
答案 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
,因为它没有用处。