Нет доступа к параметрам шаблона - PullRequest
1 голос
/ 27 ноября 2010

Почему я не могу сделать это:

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

Проблема, с которой я столкнулся, заключается в том, что я не могу скомпилировать этот код по той причине, что я получаю сообщение об ошибке, в котором говорится, что параметр E не былобъявлен.Есть ли способ, которым я могу использовать этот формальный параметр или нет?

Ответы [ 4 ]

3 голосов
/ 28 ноября 2010

Параметры параметров шаблона шаблона не получают аргументов и, следовательно, обычно не имеют имен.Частичная специализация является исключением из этого правила.Попробуйте вместо этого:

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
2 голосов
/ 27 ноября 2010

Ваш параметр шаблона Derived - это сам шаблон, E - его формальный параметр. Вам также нужно передать значение для него.

Может быть, вам нужно следующее:

template<template<class E>class Derived, class T>
struct X
{
    static void f()
    {
        Derived<T>::value;
    }
};
1 голос
/ 28 ноября 2010

Ваш синтаксис немного запутан.

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

должен работать нормально.

1 голос
/ 28 ноября 2010

Вы не можете использовать этот параметр, потому что он просто означает, что Derived - это шаблон с ровно одним аргументом типа.

Вы бы позвонили f так:

template <class T>
struct ZZZ {};

X<ZZZ>::f();
  ^^^

Обратите внимание, что в этом экземпляре нет E.

Если нет причин использовать шаблоны шаблонов, вы можете просто использовать обычный шаблон, иначе вам нужно будет передать E в качестве отдельного аргумента, чтобы вызов выглядел так:

X<ZZZ, int>::f();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...