zoukankan      html  css  js  c++  java
  • 动态链接库中导出模板函数

    动态链接库中导出模板函数

    C++ 支持函数模板。利用函数模板,能够简化我们的程序代码。我在自己的代码中也经经常使用到函数模板,可是曾经一直以为函数模板是要放到头文件里的,否则调用模板函数时,编译器会找不到函数模板的定义。今天闲暇,又翻了翻 C++ Primer。发现我曾经的理解是有问题的。模板函数也能够像普通函数那样。将声明放在头文件里。定义放在.cpp 中。这时又想到还有一个问题,DLL 中能否够导出模板函数呢。

    假设能够的话,就能够将函数的实现代码真正隐藏起来了。经过一番实验,发现是能够的,可是有一些限制。

    比方有例如以下的函数:

    template<class TYPE> TYPE max(TYPE a, TYPE b)
    {
        return (a > b) ? a : b;
    }

    直接写成以下的样子是不行的。

    template<class TYPE> __declspec(dllexport) TYPE max(TYPE a, TYPE b)
    {
        return (a > b) ?

    a : b; }

    由于 DLL 中想要导出一个函数。必需要生成这个函数的实体。

    而普通的函数模板在实例化之前是没有实体的。既然没有实例化,我们就人为的实例化它。比方以下这样:

    template<class TYPE> TYPE max(TYPE a, TYPE b)
    {
        return (a > b) ? a : b;
    }
    
    template __declspec(dllexport) int max(int a, int b);
    template __declspec(dllexport) char max(char a, char b);
    template __declspec(dllexport) short max(short a, short b);

    再次编译。就成功的导出了三个 max 函数。

    可是这里要注意,刚開始时我写成了这个样子:

    template<class TYPE> TYPE max(TYPE a, TYPE b)
    {
        return (a > b) ? a : b;
    }
    
    template<int> __declspec(dllexport) int max(int a, int b);
    template<char> __declspec(dllexport) char max(char a, char b);
    template<short> __declspec(dllexport) short max(short a, short b);

    结果一个函数也没导出来。不知这是 VC2010 的bug 还是特意这么设计的。

    手里没有其它的C++ 编译器,不知其它的 C++ 编译器上结果怎样。

  • 相关阅读:
    Dapper缓冲的真正含义
    css字体变瘦,窄
    打印request的信息
    部分浏览器cookie无法传输cookie,谷歌51-66版本
    Vue点击div以外的地方使div消失
    MybatisPlus模糊查询(like),查询不到中文,却可以查询到英文和数字的一种解决办法
    看起来很唬人,然而却简单实用的CAP理论
    做业务系统研发如何做到认真负责?
    聊聊关于创业公司招聘技术负责人
    [系列] Go
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7241508.html
Copyright © 2011-2022 走看看