类模板实例化的两种主要方式
- 显式实例化:程序员明确指定模板参数,告诉编译器生成特定类型的模板实例。
示例:
template <typename T>
class MyClass {
public:
T data;
MyClass(T value) : data(value) {}
};
// 显式实例化
MyClass<int> myIntObj(10);
- 隐式实例化:编译器根据使用模板的上下文,自动推断出需要实例化的模板类型。
示例:
template <typename T>
class MyClass {
public:
T data;
MyClass(T value) : data(value) {}
};
void func() {
MyClass obj(20.5); // 隐式实例化,T被推断为double
}
实例化过程中编译器的检查
- 语法检查:检查模板定义中的语法是否正确,如函数声明、语句结构等。例如在上述
MyClass
模板中,检查MyClass(T value) : data(value) {}
构造函数的语法是否正确。
- 类型检查:检查模板参数在模板定义中的使用是否合法。比如在
MyClass
中,T
类型是否支持模板中对它进行的操作,如MyClass(T value)
构造函数中T
类型要支持赋值操作。
- 模板参数匹配检查:在显式实例化时,检查所提供的模板参数是否与模板定义中的参数列表匹配。例如
MyClass<int> myIntObj(10);
,检查int
是否符合MyClass
模板对模板参数T
的要求。