Templates的编译和链接

    对于程序员而言C++ templates可说是十分容易设计与使用的,但对于编译器和链接器而言却是一大挑战。编译器遇到一个 template时,不能够立刻为他产生机器代码,他必须等待,知道template被指定为某种类型。从程序员的观点来看,这意味着template function或template class的完整定义将出现在template被使用的每一个角落,否则,编译器就没有足够的信息可以帮助产生目的代码。当多个源文件使用同一个template时,事情更趋复杂。

    每一个使用template的程序代码的目的文件中都存在有template代码,链接器负责复制和删除


    假设有一个程序,包含两个源文件A.CPP和B.CPP,以及一个THREE.H(其内定义了一个template类,名为CThree)。A.CPP和B.CPP都载入THREE.H。如果A.CPP以int和double使用这个template类,编译器将在A.OBJ中产生int和double两种版本的template类可执行代码。如果B.CPP以int和float使用这个template类,编译器将在B.OBJ中产生int和float两种版本的template类的可执行代码。即使A.OBJ中已经有一个int版了,编译器却没有办法知道


   但这不要紧,因为在链接过程中,所有重复的部分将被删除。