Q: C++ 模板用 typenameclass 有啥区别? A: 无论使用 class 还是 typename 声明类型参数,效果都是相同的,选择使用哪个关键字主要取决于个人或团队的偏好。一般来说,较为常见的做法是在声明类模板时使用 class,而在嵌套类型的声明或模板内部使用时则使用 typename。


早期的 C++ 标准将 class 用作声明类型参数的关键字。为了支持模板内嵌套类型C++98 标准引入了 typename, 同时为了兼容性,class 作为模板类型声明的关键字继续保留。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// template<class>
template<class T>
class MyClass1 {
    // ...
};

// template<typename>
template<typename T>
class MyContainer {
public:
    // internal usage
    using value_type = T;
    // nested type
    typename MyContainer<T>::value_type getValue() {
        // ...
    }
};