类型名

  1. 当后跟一个限定名称时,typename 指定它是一个类型的名称。这通常在模板中是必需的,特别是当嵌套名称说明符是除当前实例化之外的依赖类型时。在此示例中,std::decay<T> 取决于模板参数 T,因此为了命名嵌套类型 type,我们需要使用 typename 为整个限定名称添加前缀。有关更多详细信息,请参阅 模板typename 关键字的位置和原因?

    template <class T>
    auto decay_copy(T&& r) -> typename std::decay<T>::type;
    
  2. 模板的声明中引入类型参数。在这种情况下,它可以与 class 互换。

    template <typename T>
    const T& min(const T& x, const T& y) {
        return b < a ? b : a;
    } 
    

Version >= C++ 17

  1. typename 也可以在声明参数名称前面的模板模板参数时使用,就像 class 一样。

    template <template <class T> typename U>
    void f() {
        U<int>::do_it();
        U<double>::do_it();
    }