模板是C++泛型编程的核心,通过template定义函数和类实现类型通用。1. 模板函数如max(T a, T b)可自动推导类型,支持显式指定;2. 多参数模板如printPair处理不同类型;3. 模板类如Stack构建通用数据结构,需实例化时指定类型;4. 模板定义须在头文件中,避免分离声明与实现导致链接错误;5. 注意类型操作合法性及推导失败问题。掌握这些可提升代码复用与灵活性。

在C++中,模板是实现泛型编程的核心工具。通过模板函数和模板类,可以编写与数据类型无关的通用代码,提高代码复用性和灵活性。下面详细介绍它们的使用方法。
模板函数的基本用法
模板函数允许你定义一个函数,使其参数类型在调用时才确定。
使用 template 关键字声明模板,后跟类型参数列表(通常用 typename T 或 class T)。
例如,写一个通用的比较函数:
立即学习“C++免费学习笔记(深入)”;
templateT max(T a, T b) { return (a > b) ? a : b; }
调用时无需显式指定类型,编译器会自动推导:
int x = 5, y = 10; double m = 3.14, n = 2.71;std::cout << max(x, y) << std::endl; // 输出 10 std::cout << max(m, n) << std::endl; // 输出 3.14
也可以显式指定类型:
max(m, n);
多个模板参数的处理
模板函数可以有多个类型参数,适用于不同类型之间的操作。
templatevoid printPair(T a, U b) { std::cout << a << ", " << b << std::endl; }
调用示例:
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
printPair(10, "hello"); // int 和 const char*
printPair("age", 25); // const char* 和 int
模板类的定义与使用
模板类用于创建通用的数据结构,比如容器。
同样使用 template 声明,类内使用类型参数。
templateclass Stack { private: std::vector elements; public: void push(const T& value) { elements.push_back(value); } void pop() { if (!elements.empty()) { elements.pop_back(); } } T top() const { if (!elements.empty()) { return elements.back(); } throw std::out_of_range("StackzuojiankuohaophpcnTyoujiankuohaophpcn::top(): empty stack"); } bool empty() const { return elements.empty(); }};
使用模板类时必须指定具体类型:
StackintStack; Stack<:string> stringStack; intStack.push(1); intStack.push(2); std::cout
stringStack.push("Hello"); stringStack.push("World"); std::cout
模板的注意事项
模板的定义(包括函数体或类成员函数)通常需要放在头文件中,因为编译器要在编译时看到完整定义才能实例化模板。
常见错误包括:
- 将模板函数声明和定义分离到 .h 和 .cpp 文件导致链接错误
- 类型不支持模板中的操作(如比较、赋值等)
- 复杂类型推导失败,需手动指定模板参数
建议在调试模板问题时,检查错误信息中的实例化路径,确认类型是否匹配。
基本上就这些。掌握模板函数和模板类,能让你写出更灵活、可复用的C++代码。关键是理解类型参数的替换机制,并注意定义位置和类型约束。不复杂但容易忽略细节。








