各位老虾:  
小弟的程序是这样  
a.h  
   template  <class  T>  
   class  A  
   {  
   public:  
       A();  
       ~A();  
};  
 
a.cpp  
 
#include  "a.h"  
template  <class  T>  
A<T>::A()  
{  
;  
}  
 
A<T>::~A()  
{  
;  
}  
 
 
test.cpp  
 
#include  "a.h"  
main()  
{  
A<int>  a;  
return  1;  
}  
 
然后,直接用vc打开test.cpp,按F7,系统自动生成工程。  
但是报错,  
error  LNK2001:unresolved  external  symbol  "public:__this  call  A<int>::A<int>  (void)"  (??0?$A@H@@QAE@XZ)  
 
error  LNK2001:unresolved  external  symbol  "public:__this  call  A<int>::~A<int>  (void)"  (??0?$A@H@@QAE@XZ)  
 
debug/test.exe  :  fatal  error  LNK1120:  2  unresolved  externals  
Error  executing  link.exe  
 
这是怎么回事啊?请各位帮忙!

解决方案 »

  1.   

    .cpp  
     
    #include  "a.h"  
    template  <class  T>  
    A<T>::A()  
    {  
    }  template  <class  T>   
    A<T>::~A()  
    {  
    }  
      

  2.   

    目前vc6、7版本不支持类模板的声明和实现分别放在头文件(h)和源文件(cpp)中,只能将声明和实现全部放在头文件中。
    这样做的原因是模板的一个特性决定的,因为模板中的operation在没有被别人使用前是不被编译的。因此,你可以在模板中写一个不符合语法的operation,只要你没有使用这个operation,编译器永远不会报错。
      

  3.   

    template实现时,编译器取.h生成临时的.cpp,
    所以,如果.h没有实现体,肯定报错,也就是说,并不支持.h和.cpp分开。
      

  4.   

    VC对模板的支持很不完善.它不支持关键字export,它提供的__declspec(dllexport)又有相当的限制,因此编译单元一般不能访问其它编译单元定义的模板类的实现(VC的编译单元为CPP源文件).目前只能将实现和定义都放在H头文件中.需要注意的是,这样一来,对不同的编译单元,使用的实际上是不同的类!如果类中用到了静态成员,那么它们在不同编译单元中将同时存在.