c++模板函数分离编译的问题

      因为最近在看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);
}
原文地址:https://www.cnblogs.com/zeakey/p/4557185.html