这个工程这样写有什么有关问题

这个工程这样写有什么问题
工程分为三个文件,templateclass.h、templateclass.cpp和main.cpp三个文件,内容如下:
//templateclass.h
template <class   T>
class   test{
public:
test(){};
test(T   a);
~test(){};
T&   a();
private:
T   _a;
};
//templateclass.cpp
#include   "templateclass.h "
template <class   T>
T&   test <T> ::a(){
return   _a;
}

template <class   T>
test <T> ::test(T   a){
_a   =   a;
}
//main.cpp
#include   <iostream>
#include   "templateclass.h "
using   namespace   std;

int   main(){
test <int>   a;
a.a()   =   1;
cout < <a.a() < <endl;
return   0;
}  
VC6出现LNK2001错误,请高手指教。

------解决方案--------------------
把定义都放在.h里
------解决方案--------------------
模板类的函数体对使用这个模板类的地方应该是可见.

也就是说,你可以在引用模板的cpp文件里再定义这个函数体.
当然如果函数被多处使用,就只有定义在头文件里了, 因为大家都说了,没编译器支持export或类似方法.

一般只被内部调用的模板函数,你可以在cpp中定义.
------解决方案--------------------
vc, vc.net, vc2005 都不支持的export- -!,只晓得有一家叫EDG的公司的编译器支持

所以你还是乖乖定义 在.h里吧
------解决方案--------------------
人家atl wtl 不都只有.h吗
------解决方案--------------------
现在大多数的编译器对模板都没有完全支持,内容之一就是关键字export,export的作用是使模板的定义和声明分开,也就是在不同的文件中,所以你把他们分开在不同的文件中就会出错,模板的特性是静态多态,也就是在编译期间时的多态,所以编译的时候编译器就需要知道代码中有哪些模板的运用并将他们实例化,貌似编译器跨文件来找出特定模板的对应定义在编译技术上有一定难度,所以厂家对export的支持就不好或者不支持,Effective C++的作者Scott Meyers也很无奈:

------解决方案--------------------
这样你应该明白了吧:)