函数模板的声明和定义写在一个头文件里,因为这样在别的cpp(假设是main)里调用(相当于这个cpp就有定义)才能实例化。
否则main-cpp(只有声明没有定义)调用生成的obj文件会去这个头文件(函数模板的声明)对应的obj文件找相应的实例化的函数的二进制代码,但是那个obj文件对应的cpp只有定义而没有调用!而没有调用就没有实例化,所以对应的obj文件也没有实例化函数的二进制代码,这样链接就出事了。
不能在函数模板中打算使用不同的case针对不同的类型进行操作(比如0对int,1对string),因为对于一个类型的函数模板调用就实例化了整个函数,这些case也会被实例在这个类型上,就会出现类型不匹配的错误(错误可不管你case几,因为调用首先要实例化,实例化就发现出错了,没有管参数是多少)。
比如用case0,并且实例化一个int,但是case1中也要根据int生成二进制代码,但人家是string类型,就出错了
这对if也是一样的。
比如这样,这些map对应不同的类型,就会出错。
上面说了case中采用不同的类型,实际上也不能在case中调用不同类型的模板函数。不要用函数模板(假设是1)调用多个函数模板(假设是2)。
比如一个函数模板1里switch调用不同的模板2,你只希望根据case和相应的参数来调用某个模板2,但是由于其他函数模板2也会根据这些参数的类型实例化,然而实例化很可能出错,因为你可能只考虑了某个case,而这些模板2是不同的实现。
比如这样,函数模板2根据map的参数和key的参数推导,但模板1只考虑了某个case和对应的key的类型,这会导致后面的case中出现map和key类型不匹配(因为map的类型1是和key类型共用的)
还是那个问题,实例化考虑参数的类型,执行才考虑参数的值。