因为最近在看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);
}

 

相关文章:

  • 2022-02-17
  • 2021-10-29
  • 2021-08-14
  • 2021-07-26
  • 2021-12-21
  • 2022-12-23
  • 2022-01-30
  • 2022-02-10
猜你喜欢
  • 2021-11-18
  • 2021-12-29
  • 2021-07-22
  • 2021-07-24
  • 2021-06-30
  • 2022-01-23
相关资源
相似解决方案