1)模板的形参是const引用
2)函数体中的测试只用<比较
通过将形参设为const引用,就可以允许使用不允许复制的类型。而且,如果有比较大的对象调用compare,则这个设计还可以使函数运行得更快。
比较下面两段程序:
templateint compare(const Type &val1,const Type &val2) { if (val1 < val2) return -1; else if (val1 > val2) return 1; return 0; }
与:
templateint compare(const Type &val1,const Type &val2) { if (val1 < val2) return -1; else if (val2 < val1) return 1; return 0; }
下面的程序可以减少对可用于compare函数的类型的要求,这些类型必须支持<,但不必支持>
【警告:链接时的编译时错误】
一般而言,编译模板时,编译器可能会在三个阶段中标识错误:
第一阶段是编译模板定义本身时。在这个阶段中编译器一般不能发现许多错误,可以检测到诸如漏掉分号或变量名拼写错误一类的语法错误。
第二个错误检测时间是在编译器见到模板的使用时。在这个阶段,编译器仍没有很多检查可做。对于函数模板的调用,许多编译器只检查实参的数目和类型是否恰当,编译器可以检测到实参太多或太少,也可以检测到假定类型相同的两个实参是否真地类型相同。对于类模板,编译器可以检测提供的模板实参的正确数目。
产生错误的第三个时间是在实例化的时候,只有在这个时候可以发现类型相关的错误。根据编译器管理实例化的方式,有可能在链接时报告这些错误。
重要的是,要认识到编译模板定义的时候,对程序是否有效所知不多。类似地,甚至可能会在已经成功编译了使用模板的每个文件之后出现编译错误。只在实例化期间检测错误的情况很少,错误检测可能发生在链接时。