C++ 模板的两大特性:typename 用法与分离编译
1. 关于 typename 的使用场景
在模板编程中,typename 或 class 用于定义模板参数。但在某些场景下,必须使用 typename,例如编写通用打印容器的函数模板。
#include <iostream>
#include <vector>
#include <list>
using namespace std;
template<class Container>
void Print(const Container& con) {
Container::const_iterator it = con.begin();
while (it != con.end()) {
cout << *it << " ";
it++;
}
cout << endl;
}
int main() {
vector<int> v = {1, 2, 3, 4, 5, 6};
list<int> lt = {1, 2, 3, 4, 5, 6};
Print(v);
Print(lt);
return 0;
}
这里的 Container 可以是任意容器。STL(Standard Template Library)是 C++ 标准库的重要组成部分,包含数据结构与算法框架。容器负责存储和管理数据,迭代器负责访问数据。
运行上述代码会报错,问题出在 这一句。由于模板的存在,编译器在编译时不知道 具体是什么类型。它无法确定 是一个类型还是一个变量。如果它是类型,则合法;如果是静态成员变量,则不合法。对于类来说, 可能是内部类或 typedef 定义的类型,也可能是静态成员变量。


