我的一个DLL工程里,有几个直接export的class,这些class用起来没有用。后来,我在里面添加了一个template class,但是发现怎么使用都不可以。很奇怪:
template <typename T>
class _Export HashMap
{
    ....
} ;
和这个DLL工程中的其它class完全一样,仅仅就是加了template变成了tempalte class而已。为什么他的导出就会出问题呢?
(我指的导出出问题是指的在使用这个DLL的其它工程里,会出现HashMap符号未定义的错误。同时,使用VC自带的Depen工具查看DLL中的所有函数,就没有HashMap的身影出现。

解决方案 »

  1.   

    因为模板函数在链接之前要具现化(用候捷的话说)
    我想你的DLL里如果没有用到这个模板,编译器就不知道该如果对模板类生成可用的代码。编译器也不会对每一个<typename T>去实现一个函数加到你的dll里,这是不可能的。而其它的程序用此DLL,只是把该DLL的代码加载到进程的地址空间,在这个过程中,是不可能有任何借助编译器的具现化发生的。就是说,模板是一个抽象的概念,只有在编译期,编译程序认为有必要按某类型具现化模板,那对应该类型的模板实例(这时该是一个“普通”的类了)才会生成。
      

  2.   

    看过前面的文章了吗
    把你的_Export换成AFX_EXT_CLASS看看,具体可以参考msdn,有说明的