0

0

c++中如何定义模板类_c++模板类用法详解

冰火之心

冰火之心

发布时间:2026-01-04 08:53:02

|

852人浏览过

|

来源于php中文网

原创

模板类在定义时类型即参与编译,T是待推导的编译期实体;声明与定义必须同在头文件中,否则链接失败;成员函数定义需双重template前缀;偏特化需谨慎处理const/引用折叠,且不支持函数模板;推导失败常见于隐式转换、右值引用和初始化列表场景。

c++中如何定义模板类_c++模板类用法详解

模板类不是“先写类再套模板”,而是从定义那一刻起,类型就参与编译——T 不是占位符,是待推导的编译期实体。

模板类定义必须写在头文件里

因为编译器需要在每个使用它的翻译单元中实例化具体类型。如果把 template 声明放在 .h,而定义(实现)放在 .cpp,链接时会报 undefined reference to MyClass::func()

  • 所有模板声明和定义都放在 myclass.h
  • 不支持分离式编译(除非显式实例化,但极少用)
  • 头文件中避免 #include 过多,否则编译时间飙升

成员函数必须也带 template 前缀

类外定义成员函数时,不能只写 MyClass::func(),必须补全两层 template

template 
template 
void MyClass::process(const U& u) {
    // ...
}

第一行针对类模板参数 T,第二行针对成员函数自己的模板参数 U。漏掉任一层都会导致编译失败,错误信息常为 ‘process’ is not a member of ‘MyClass

立即学习C++免费学习笔记(深入)”;

偏特化要小心 const 和引用折叠

比如你想对指针类型做偏特化:

X-Node企业快速建站1.0.6.0801
X-Node企业快速建站1.0.6.0801

特色介绍: 1、ASP+XML+XSLT开发,代码、界面、样式全分离,可快速开发 2、支持语言包,支持多模板,ASP文件中无任何HTML or 中文 3、无限级分类,无限级菜单,自由排序 4、自定义版头(用于不规则页面) 5、自动查找无用的上传文件与空目录,并有回收站,可删除、还原、永久删除 6、增强的Cache管理,可单独管理单个Cache 7、以内存和XML做为Cache,兼顾性能与消耗 8、

下载
template 
class MyContainer { ... };

这能匹配 int*,但匹配不了 const int*int* const——它们是不同类型。更安全的方式是用类型特征配合 std::remove_pointer_t 在主模板内部分支处理,而不是盲目偏特化。

  • 偏特化不支持函数模板(只能全特化)
  • MyContainerMyContainer 是独立偏特化,不会自动覆盖
  • 若主模板有默认参数,偏特化里不能重复写,默认参数不继承

模板参数推导失败的常见原因

构造函数调用时,编译器不一定能从实参推出 T,尤其涉及隐式转换或右值引用时:

  • 传入字面量 42,推导为 int;但传入 42.0,可能推导为 double 而非你期望的 float
  • 使用 std::forward 时,若模板参数是 T&&,传入左值会推导成 T&(引用折叠),不是 T
  • 初始化列表构造: MyClass{1, 2, 3} 无法推导 T,必须写成 MyClass{1, 2, 3}

这时候可以加一个非模板的辅助函数,比如 make_myclass(1, 2, 3),内部用 decltypestd::decay_t 控制推导行为。

模板类真正的复杂点不在语法,而在类型依赖路径是否被编译器全程看见——少一个 typename、漏一次 template 关键字、或者在依赖上下文中用了未声明的嵌套类型,错误信息就会跳转到八百行外,而且满屏都是 expected ‘;’ before ‘...’

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

554

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

98

2025.10.23

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

529

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号