相当于"typename",表示依赖名称确实是'模板模板参数'

Ad *_*d N 4 c++ templates dependent-name c++11

我们将一部分无法找到正确语法的代码减少到最小的示例.

我们假设以下定义(不用担心"为什么";)

template <class>
class Element
{};

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

template <class>
struct TemplatedProvider
{
    template <class T>
    using element_template = Element<T>;
};
Run Code Online (Sandbox Code Playgroud)

现在,在C++ 11之后,我们可以使用类模板或类型别名模板来实例化Client模板.以下函数编译得很好:

void fun()
{
    Client<Provider::element_template> client;
    Client<TemplatedProvider<int>::element_template> clientBis;
}
Run Code Online (Sandbox Code Playgroud)

但是,当给出的模板参数Client是依赖名称时,我们在以下情况下找不到正确的语法:

template <class T>
void templatedFun()
{
    Client<TemplatedProvider<T>::element_template> client;
}
Run Code Online (Sandbox Code Playgroud)

Clang(用3.6测试)发出以下编译错误:

template argument for template template parameter must be a class template or type alias template
Run Code Online (Sandbox Code Playgroud)

我们可以修复这种语法吗?

m.s*_*.s. 9

它一定要是:

template <class T>
void templatedFun()
{
    Client<TemplatedProvider<T>::template element_template> client;
}
Run Code Online (Sandbox Code Playgroud)