【template】
1、当定义template的时候,并没有生成实例,当使用一个模板的时候才会生成一个实例。
2、模板的编译:
1)在实例化之前,先检查模板代码本身,查看是否有语法错误,如遗漏分号。
2)在实例化期间,检查模板代码,看是否所有的调用都有效,如类型匹配。
3、自定义类型会优先于参数类型推测而生成实例。注意:模板推测只应用于函数模板,类模板必须指定类型。
4、由于模板的2次编译性,当使用一个类方法模板时,需要先检测函数模板本身,再检测类型是否匹配,所以类函数模板必须放置在头文件中,或者放置在inl文件中。
5、当模板待生成的类型已存在时,则模板不会实例化,而会使用已有类型。
6、模板特化:
1)全特化(指定所有模板参数):
2)局部特化(指定几个模板参数):
7、typename,如果不使用typename,则下图代码的T::SubType会被compile认为是静态变量乘以ptr:
8、受限名称 & 依赖名称:
9、模板嵌套
10、非依赖类型不会在依赖类型的基类中查找,因为依赖类型只有在实例化时才会进行名字查找。所以如下代码中,basefield变量会找不到:
解决的方案是,证basefield也变为依赖类型,使用this或者 Base<T>::basefield。