2015-10-29 3 views
4

Мы сократили часть кода, мы не можем найти правильный синтаксис для минимального примера.Эквивалент «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; 
} 

См this question для детального обсуждения на template и typename ключевых слов.

+0

Хорошее дополнение с информационной ссылкой – GreatAndPowerfulOz

9

Он должен быть:

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