C++ 模板中 template<typename T>
与 template<class T>
的深度解析
在 C++ 模板编程中,typename
和 class
在声明模板类型参数时功能完全等价,可以互换使用。但它们在语义和特定场景中有微妙区别:
核心结论(先决要点)
// 以下两种声明完全等效
template <typename T> void function1(T param) {
} // 现代推荐
template <class T> void function2(T param) {
} // 传统方式
详细区别分析
1. 历史背景与设计意图
关键字 | 引入版本 | 设计初衷 | 现代适用性 |
---|---|---|---|
class |
C++98 | 最初用于表示"用户定义类型" | 兼容但语义不准确 |
typename |
C++98 | 解决语法歧义,表示"任何类型" | 现代代码推荐 |
2. 语义差异
-
class
关键字:- 暗示模板参数应是类类型
- 实际接受任何类型(基本类型、枚举等)
- 可能导致初学者误解
-
typename
关键字:- 明确表示"类型名称"
- 准确涵盖所有类型场景
- 语义更清晰、更普适
3. 功能区别场景
场景 1:基本模板参数声明(两者等价)
template <class T> class Box1 {
/*...*/ }; // 合法
template <typename T> class Box2 {
/*...*/ }; // 合法