为什么我不能这样做:
template<template<class E>class Derived>
struct X
{
static void f()
{
Derived<E>::value;
}
};
我遇到的问题是我无法编译此代码,因为我收到的错误是说param E尚未声明。有没有办法可以使用这个正式的参数?
答案 0 :(得分:3)
模板模板参数的参数不获取参数,因此通常不具有名称。部分专业化是此规则的例外。试试这个:
template<class> // Derived<E> is only only parameter
struct X; // but you actually need two parameters, Derived and E
template< template <class> class Derived, class E >
struct X< Derived< E > > // so use partial specialization.
{
static void f()
{
Derived<E>::value; // only reason to want this is to
Derived<int>::value; // use different specializations
}
};
当然,如果您不需要重新专注于Derived< something_else >
,请忽略Derived<E>
是模板专业化的事实:
template<class Derived>
struct X
{
static void f()
{
Derived::value;
}
};
X< my_class< something > > my_x; // a specialized class template is a class
答案 1 :(得分:2)
您的模板参数Derived
本身就是模板,E
是其形式参数。
你也需要为它传递一个值。
也许您需要以下内容:
template<template<class E>class Derived, class T>
struct X
{
static void f()
{
Derived<T>::value;
}
};
答案 2 :(得分:1)
你不能使用那个参数,因为它只是意味着Derived
是一个只有一个类型参数的模板。
你可以这样打电话给f
:
template <class T>
struct ZZZ {};
X<ZZZ>::f();
^^^
请注意,此实例化中没有E
。
除非有理由使用模板模板,否则您可以使用常规模板,否则您需要将E
作为单独的参数传递,使调用看起来像这样:
X<ZZZ, int>::f();
答案 3 :(得分:1)
你的语法有点混乱。
template<class E>
struct X
{
static void f()
{
Derived<E>::value;
}
}
应该可以正常工作。