类模板必须在定义前加template,声明与定义通常需同在头文件中;实例化须显式指定类型参数,不支持自动推导;特化需重写整个类体,不可仅特化单个成员函数。

必须在类定义前加 template<typename t></typename>,且声明和定义通常得放在同一个头文件里——否则链接时报 undefined reference。
类模板声明必须带 template<typename t></typename> 前缀
编译器只认这个前缀作为“这是个模板”的信号。漏掉它,哪怕类里全用 T 定义成员,也会被当成普通类,后续实例化直接失败。
-
template<typename t></typename>和template<class t></class>效果一致,但typename更准确,尤其涉及嵌套类型(如T::value_type)时 - 模板参数名要统一:声明用
T,类外定义成员函数也得用T,换成U就断连 - 不能只在 .cpp 里写
template<typename t></typename>,头文件中类定义前没这行,照样报错
成员函数定义必须显式带上模板参数和作用域
类外定义成员函数时,光写 void Stack::push(...) 是错的——编译器会当它是全局函数或非模板类成员。
- 必须写成
template<typename t> void Stack<t>::push(...)</t></typename> -
Stack<t>::</t>不能简写为Stack::,否则报non-template class - 构造函数、析构函数、
operator重载等所有成员函数,只要属于模板类,都适用这条规则
类模板不能自动推导类型,必须显式指定 <int></int>、<:string></:string> 等
不像函数模板能靠参数推导 T,类模板实例化时必须手动填尖括号,否则编译不通过。
- 正确:
MyArray<int> arr(10);</int>、MyArray<:string> strArr(5);</:string> - 错误:
MyArray arr(10);(缺类型参数)、auto x = MyArray(10);(C++20 也不支持类模板参数自动推导,除非有配套的推导指引) - 可以设默认参数:
template<typename t="int"> class MyArray { ... };</typename>,然后用MyArray表示MyArray<int></int>
特化和偏特化必须完整重写类体,不能只改个别函数
C++ 不允许只特化一个成员函数。全特化(如 Stack<int></int>)是全新类;偏特化(如 Stack<t></t>)也得把整个类重新定义一遍。
- 全特化以
template开头,后面紧跟class Stack<int></int>,不是template<typename t> class Stack<int></int></typename> - 偏特化写法是
template<typename t> class Stack<t></t></typename>,注意不是template<typename t> class Stack<t></t></typename>加条件 - 友元函数(如
operator)若要适配模板类,自身也得是模板,且参数类型需与类模板一致(常需另起占位符避免冲突,如 <code>TT)
最容易被忽略的是:模板代码必须让编译器“看见”实现,所以几乎总是得塞进头文件。哪怕你只想暴露接口,也得把定义一起放进去——不然别人 #include 之后一用就链接失败。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











