等同于"typename",表示从属姓名确实是'template template parameter'

Equivalent of "typename", to indicate that a dependant name is indeed a 'template template parameter'

本文关键字:template parameter typename 表示 等同于      更新时间:2023-10-16

我们将无法找到正确语法的部分代码简化为一个最小的示例。

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

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 <class T>
void templatedFun()
{
    Client<TemplatedProvider<T>::template element_template> client;
}

您可以使用template关键字:

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

有关templatetypename关键字的详细讨论,请参见此问题。