• 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);
    }
  • 相关阅读:
    struct与class的区别
    C#锐利体验第五讲 构造器与析构器(转)
    Sort Table
    WinXP(NTFS分区下)Vista系统文件的删除方法
    关于上海居住证我们不得不说的实情!(转)
    让你眼花缭乱的JS代码~~
    ASP的URL重写技术(IIS的ISAPI)[转]
    JS实现从照片中裁切自已的肖像
    C#锐利体验第二讲 C#语言基础介绍(转)
    装箱和拆箱
  • 原文地址:https://www.cnblogs.com/zeakey/p/4557185.html
Copyright © 2020-2023  润新知