zoukankan      html  css  js  c++  java
  • [百度空间] [原]DLL导出实例化的模板类

    因为模板是在编译的时候根据模板参数实例化的,实例化之后就像一个普通的类(函数),这样才有对应的二进制代码;否则,没有模板参数,那么编译器就不知道怎么生成代码,所以生成的DLL就没有办法导出模板了.
    但是根据MSDN的描述,可以导出模板类的实例化后的代码(注意:这里不是指实例化模板类的一个对象),
    比如 template<typename T> class singleton,那么可以导出singleton<MyClass>或者其他已知类型的类代码.
    详见: http://support.microsoft.com/kb/168958/en-us.这个例子比较老,竟然是VC5的代码,不过我试了一下,在VC8下可以导出,不过要将exe文件中的extern声明去掉.否则不能通过.

    关键语句:
        #ifdef EXP_STL
        #    define DECLSPECIFIER __declspec(dllexport)
        #else
        #    define DECLSPECIFIER __declspec(dllimport)
        #endif

    分别在EXE和DLL中使用这个声明: template class DECLSPECIFIER TEMPLATE<TYPE>;
    就可以导出一个TYPE实例的TEMPLATE类代码.

    MSDN上说,从一个实例化模板类集成过来的DLL导出类,就不用再声明了,好像因为在声明这个类的时候编译器已经知道了:

    class DECLSPECIFIER myInterface : public singleton<myInterface>{}
    class DECLSPECIFIER myInterface : public std::vector<short*>{}
    这种方法直接就可以导出了,而且好像有些情况也里也不用去管C4251(http://msdn.microsoft.com/en-us/library/esew7y1w.aspx)的编译警告...

  • 相关阅读:
    文件操作(IO 技术)
    异常
    面向对象进阶
    面向对象
    函数用法和底层分析
    控制语句
    集合
    字典
    元组 tuple
    Python3 列表
  • 原文地址:https://www.cnblogs.com/crazii/p/4512829.html
Copyright © 2011-2022 走看看