无权访问模板模板参数

时间:2010-11-27 19:08:35

标签: c++ templates

为什么我不能这样做:

template<template<class E>class Derived>
struct X
{
    static void f()
    {
        Derived<E>::value;
    }
};

我遇到的问题是我无法编译此代码,因为我收到的错误是说param E尚未声明。有没有办法可以使用这个正式的参数?

4 个答案:

答案 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;
    }
}

应该可以正常工作。