6.1 函数模板与类模板
答:______________
✅ 查看答案与解析
答案 对
解析:模板不是“能装任何类型的代码”,而是模具。实例化发生在使用点。
答:______________
✅ 查看答案与解析
答案 对
解析:这也是算法竞赛和数据结构课偏爱 C++ 的原因之一:零开销抽象。
maxOf<long long>
maxOf<int>
maxOf<double>
不实例化,运行时判断
答:______________
✅ 查看答案与解析
答案 B
解析:实参 3、5 都是 int,编译器推导 T = int,实例化为 maxOf<int>。
template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }
auto m = maxOf(3, 2.5); // 报错:T 推导冲突(int vs double)
✅ 查看答案与解析
答案 两个实参类型不一致,T 无法同时推导成 int 和 double。显式指定:maxOf<double>(3, 2.5)
解析:T 只能是一个类型。要么实参同型,要么显式指定模板参数。
提示:std::string 的 > 比较字典序。
✅ 查看答案与解析
答案 参考答案:
解析:同一份模板自动适配三种类型,这就是泛型。
#include <iostream>
#include <string>
template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }
int main() {
std::cout << maxOf(3, 5) << '\n'; // 5
std::cout << maxOf(1.5, 2.5) << '\n'; // 2.5
std::cout << maxOf(std::string("ab"), std::string("cd")) << '\n'; // cd
return 0;
}6.2 模板为什么必须写在头文件里
答:______________
✅ 查看答案与解析
答案 对
解析:模板只有被实例化时才生成代码,实例化发生在使用它的源文件里,编译器必须能看到完整定义。
标准不允许
模板没有声明只有定义
模板只有被实例化时才生成代码,而实例化发生在使用它的源文件,编译器必须看到完整定义
编译器偷懒
答:______________
✅ 查看答案与解析
答案 C
解析:普通函数的定义在链接期合并;模板没有“链接”这回事,它在每个使用点现场生成代码,所以定义必须可见。
// mylist.h:只有声明
template <typename T> T pickFirst(const std::vector<T>& v);
// mylist.cpp:定义
template <typename T> T pickFirst(const std::vector<T>& v) { return v[0]; }
✅ 查看答案与解析
答案 把模板的完整定义移到头文件 mylist.h 里(声明和定义都放头文件)。
解析:模板实例化发生在使用点,main.cpp 里看不到定义就无法生成代码。工程上可用 .tpp/.ipp 文件在头文件末尾 #include 进来,本质仍是“使用方能看到定义”。
提示:pop 前检查 empty()。
✅ 查看答案与解析
答案 参考答案:
解析:类模板使用时必须写出具体类型 Stack<int>;类模板定义整体放头文件(此处同文件演示)。
#include <iostream>
#include <string>
#include <vector>
template <typename T>
class Stack {
public:
void push(const T& v) { data_.push_back(v); }
void pop() { if (!data_.empty()) { data_.pop_back(); } }
T& top() { return data_.back(); }
bool empty() const { return data_.empty(); }
private:
std::vector<T> data_;
};
int main() {
Stack<int> si;
si.push(1); si.push(2);
std::cout << si.top() << '\n'; // 2
Stack<std::string> ss;
ss.push("hi"); ss.push("yo");
std::cout << ss.top() << '\n'; // yo
return 0;
}