HM180 同册模板档

HM180 同册模板档

HM180 同册模板档

来源: 第 180 集 模板-类模板分文件编写

难度: 普及-

时间限制: 1s

空间限制: 64MB

题目描述

普通类常把声明放进 .h、实现放进 .cpp。类模板这样拆会在**链接期**报「无法解析的外部符号」:类模板的成员函数在调用时才创建,只 #include 头文件时编译器看不到 .cpp 里的实现,也就不会实例化那些成员,链接时找不到构造函数和普通成员。

两种解决办法:

  1. 直接 #include 源文件(.cpp)。能过,但很少这么做——通常只让别人看头文件,不直接包含源码。
  2. 主流做法:声明和实现写在同一个文件里,后缀改成 .hpp(约定俗成,不是语法强制)。别人一看 .hpp 就知道这是类模板。

本题按第二种:把 Person 的声明与类外实现写在同一翻译单元中(模拟 .hpp),不要拆成「只声明、实现去另一份 cpp」。

类模板 Person<T1, T2>:成员姓名、年龄;构造函数与 showPerson()getAge() 均类外实现。showPerson() 输出 姓名: 姓名 年龄: 年龄。

读入 \(n\) 个人,用 Person<string, int> 创建并展示,最后输出年龄之和(通过 getAge() 累加)。

输入格式

第一行一个整数 \(n\)(\(1 \le n \le 1000\))。

接下来 \(n\) 行,每行一个不含空白的姓名和一个整数年龄。姓名长度 \(1\sim 20\),年龄为 \(1\sim 10^6\)。

输出格式

先输出 \(n\) 行档案,再输出一行整数表示年龄之和。

样例

输入 #1

1
Jerry 18

输出 #1

姓名:Jerry 年龄:18
18

输入 #2

2
Tom 20
Anna 21

输出 #2

姓名:Tom 年龄:20
姓名:Anna 年龄:21
41

说明

链接失败的根因是成员函数创建时机在调用阶段。本题单文件评测,等价于把 .h.cpp 合并成一份 .hpp 再包含进来。不要只写声明却把实现「假装」丢到别处。

信息

ID
1179
难度
9
分类
(无)
标签
(无)
递交数
1
已通过
1
通过率
100%
上传者