Мы сократили часть кода, для которого мы не можем найти правильный синтаксис, до минимального примера.
Давайте предположим следующие определения (не беспокойтесь о «почему»;)
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
Можем ли мы исправить этот синтаксис?
Вы можете использовать template
ключевое слово:
template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::template element_template> client;
}
Увидеть этот вопрос для подробного обсуждения template
а также typename
ключевые слова.
Должно быть:
template <class T>
void templatedFun()
{
Client<TemplatedProvider<T>::template element_template> client;
}