因为最近在看caffe的源代码,几乎都是模板,因此想把自己写的几个函数程序也改为模板函数,但发现分离编译的时候make总是报错,找不到对应的模板函数。后来查了查资料发现是模板函数没有特化造成的。下面用简单的代码把这个问题展现一遍。
max.cpp:
template <typename dtype> dtype max(dtype a,dtype b) { if(a>=b) return a; else return b; }
main.cpp
#include <iostream>template <typename dtype>
dtype max(dtype a,dtype b); int main() { int a=6,b=8; std::cout<<max(a,b)<<std::endl; return 0; }
在g++中编译:
g++ -c max.cpp -o max.o g++ max.o main.cpp -o main.o
结果这样会报找不到<int> max(int , int )的错误。让我觉得很不能理解,后来查了些资料弄明白了,自己对模板的理解也深了一些。
首先这种写法如果是普通函数是没有问题的,但是模板函数有个特点就是如果没有见到对模板函数的调用,是不会生成对应的二进制码的。
”g++ -c max.cpp -o max.o“ 编译了max.cpp,但是max.cpp中没有任何对max()的调用,因此不会产生函数实例。当“max(a,b)” 调用int max(int ,int)实例时,就会找不到它。
只要在max.cpp中随便加一句调用max(int , int)的代码产生实例,就不会报错了。
template <typename dtype> dtype max(dtype a,dtype b) { if(a>=b) return a; else return b; } void a(){ int a=5; max(a,a); }