Эквивалент «typename», указывающий, что зависимое имя действительно является «шаблоном шаблона».

Мы сократили часть кода, для которого мы не можем найти правильный синтаксис, до минимального примера.

Давайте предположим следующие определения (не беспокойтесь о «почему»;)

template <class>
class Element
{};

template <template <class> class>
class Client
{};

template <class>
struct TemplatedProvider
{
template <class T>
using element_template = Element<T>;
};

Теперь, начиная с C ++ 11, мы можем использовать либо шаблон класса, либо шаблон псевдонима типа для создания экземпляра Client шаблон. Следующая функция компилируется просто отлично:

void fun()
{
Client<Provider::element_template> client;
Client<TemplatedProvider<int>::element_template> clientBis;
}

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

template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::element_template> client;
}

Clang (протестирован с 3.6) выдает следующую ошибку компиляции:

template argument for template template parameter must be a class template or type alias template

Можем ли мы исправить этот синтаксис?

4

Решение

Вы можете использовать template ключевое слово:

template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::template element_template> client;
}

Увидеть этот вопрос для подробного обсуждения template а также typename ключевые слова.

4

Другие решения

Должно быть:

template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::template element_template> client;
}
9

По вопросам рекламы [email protected]