template

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。

原文地址:https://www.cnblogs.com/tekkaman/p/3307041.html