发布时间:2026/8/23 8:57:39
Effective C++ 学习笔记 条款43 学习处理模板化基类内的名称 假设我们需要编写一个应用程序可以向多家不同的公司发送消息。消息可以以加密或明文未加密的形式发送。如果在编译期间我们有足够的信息来确定哪些消息将发送给哪些公司那么我们可以采用基于模板的解决方案这原本可以正常工作但假设我们有时希望在每次发送消息时记录一些信息。派生类可以很容易地添加这一功能而下面这种方式似乎很合理注意派生类中的消息发送函数与基类中的函数名称不同派生类中叫 sendClearMsg基类中叫 sendClear。这是好的设计因为它绕开了隐藏继承名称的问题参见条款33也避免了重新定义继承来的非虚函数所固有的问题参见条款36。但上面的代码无法编译至少对于符合标准的编译器来说是如此。这类编译器会抱怨 sendClear 不存在。我们能看到 sendClear 在基类中但编译器不会去那里查找。我们需要理解为什么。问题在于当编译器遇到类模板 LoggingMsgSender 的定义时它们不知道它继承自什么类。当然它是MsgSenderCompany但 Company 是一个模板参数要到后来当 LoggingMsgSender 被实例化时才能知道。在不知道 Company 是什么的情况下就没有办法知道MsgSenderCompany这个类长什么样。特别地也就无法知道它是否有一个 sendClear 函数。为了让问题具体化假设我们有一个坚持加密通信的 CompanyZ 类通用的 MsgSender 模板不适用于 CompanyZ因为该模板提供了一个对 CompanyZ 对象毫无意义的 sendClear 函数。为了纠正这个问题我们可以为 CompanyZ 创建一个 MsgSender 的特化版本注意这个类定义开头的template 语法。它表示这既不是一个模板也不是一个独立的类。相反它是 MsgSender 模板的一个特化版本当模板实参为 CompanyZ 时使用。这被称为全模板特化total template specialization即模板 MsgSender 针对类型 CompanyZ 进行了特化而且这个特化是全的——一旦类型参数被定义为 CompanyZ模板的其他参数就不可能再有任何变化了。鉴于 MsgSender 已经针对 CompanyZ 进行了特化再来看一下派生类 LoggingMsgSender正如注释所述当基类是MsgSenderCompanyZ时这段代码毫无意义因为那个类没有提供 sendClear 函数。这就是 C 拒绝该调用的原因它认识到基类模板可能会被特化而且这类特化可能不提供与通用模板相同的接口。因此它通常拒绝在模板化的基类中查找继承来的名称。从某种意义上说当我们从面向对象的 C 跨越到模板 C参见条款1时继承就失效了。要重新启用它我们必须以某种方式禁用 C 的“不要在模板化基类中查找”行为。有三种方法可以做到这一点。第一种你可以在调用基类函数时加上this-前缀第二种方法是使用 using 声明。如果你读过条款33这个解决方案应该会让你感到熟悉。条款33解释了 using 声明如何将隐藏的基类名称引入派生类的作用域。因此我们可以这样写 sendClearMsg虽然 using 声明在这里和条款33中都能用但所解决的问题是不同的。这里的情况并不是基类名称被派生类名称隐藏而是编译器不会去搜索基类作用域除非我们告诉它们这样做。第三种让代码编译的方法是显式指定被调用的函数在基类中这种做法通常是最不可取的方式因为如果被调用的函数是虚函数显式限定会关闭虚函数的动态绑定行为。从名称可见性的角度来看这三种做法效果相同它们都向编译器承诺基类模板的任何后续特化都会支持通用模板所提供的接口。当编译器解析像 LoggingMsgSender 这样的派生类模板时它们只需要这个承诺就足够了。但如果这个承诺最终不成立真相会在后续编译中暴露出来。例如如果源码后面出现这样一段对 sendClearMsg 的调用将无法编译因为在此时编译器已经知道基类是模板特化MsgSenderCompanyZ并且知道该类没有提供 sendClearMsg 试图调用的 sendClear 函数。从根本上说问题在于编译器是更早地诊断出对基类成员的错误引用在解析派生类模板定义时还是更晚在用特定模板实参实例化这些模板时。C 的策略是倾向于早期诊断这就是为什么它假定自己对从模板实例化出的基类内容一无所知。切记1.在派生类模板中通过 this- 前缀、using 声明或显式基类限定来引用基类模板中的名称。

相关新闻

2026/8/23 8:52:39

嵌入式Linux开发环境搭建:从交叉编译到Qt部署全流程详解

1. 从零到一:为什么嵌入式Linux开发离不开Qt? 如果你刚接触嵌入式Linux开发,可能会被一堆名词搞晕:交叉编译、根文件系统、FrameBuffer、Wayland…… 然后你发现,要在那块小小的开发板上显示一个带按钮的窗口&#xf…

2026/8/23 8:52:39

LightGBM在时间序列预测中的实战应用:以全球气温预测为例

1. 从赛题到模型:一次完整的数据建模实战复盘 去年带队参加亚太杯数学建模竞赛,我们组选的正是C题——全球气温预测。这道题乍一看是经典的时间序列预测问题,但深入下去,你会发现它远不止套个ARIMA或LSTM那么简单。它考察的是从数…

2026/8/23 8:52:39

STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你

给温控器加数据记录功能那次,客户要求"断电前至少保留最近 1000 条记录"。我一开始用片上 Flash 轮流擦两页存,每条 16 字节,两页一共只能存 128 条。后来换了 SD 卡,FatFS 一挂,f_open 一个 CSV 文件一行行…

2026/8/23 9:52:42

多智能体隐蔽协调检测:从原理到工程实践

1. 先搞清楚这个研究到底在解决什么问题 看到“超越文本:检测潜在多智能体通信中的隐蔽协调”这个标题,很多人第一反应可能是“又一个多智能体协作的论文”。但它的核心价值不在于让智能体协作,而在于 如何发现和诊断智能体之间那些“看不见…

2026/8/23 9:52:42

智能体技能检索进阶:任务分解引导重排实现自适应规划

1. 从“技能检索”到“任务分解引导重排”:一个智能体进化的必然路径在构建能够自主完成复杂任务的智能体(Agent)时,我们常常面临一个核心挑战:如何让智能体在面对一个前所未见的新任务时,能够准确地从它庞…

2026/8/23 9:52:42

[特殊字符] 工具使用与函数调用

📂 工具使用与函数调用 分类说明 Function Calling、API 编排、MCP/A2A 协议与工具管理 子分类 Function Calling 机制工具选择策略API 编排与链式调用MCP 协议A2A 协议工具注册与发现 题目列表(共 75 题)编号题目难度子分类296Function Call…

2026/8/23 9:52:42

AI Agent 面试题 370:如何设计Agent的工具调用成本优化策略?

🔥 AI Agent 面试题 370:如何设计Agent的工具调用成本优化策略?摘要:本文深入解析了「如何设计Agent的工具调用成本优化策略?」这一 AI Agent 领域的核心面试题。文章从 API 编排与链式调用 的基本概念出发&#xff0c…

2026/8/23 0:02:04

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:02:04

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:02:04

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:02:04

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:02:04

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:02:04

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/21 15:40:01

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/23 6:14:43

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…