2011-03-13 09:46:38
模板,包括模板函数及有成员函数的模板类,其声明连同定义都应该放在.h文件中!但这并非因为它们的作用域是全局的!
模本(包括其定义)本身对于编译器而言,等同于其它函数及类型的声明,声明仅表示对编译器的类型信息公告。而模板的实例化(定义实现)和其定义所在的作用域,要推迟到类型的绑定才能确定。
例如:
template <typename T>
class Pig
{
public:
void func(void);
};
template <typename T>
void Pig <T> ::func(void)
{
cout < < "Ok " < < endl;
}
//至此,Pig连同其成员func都仅是声明,编译器看到这儿,什么都不做!(这和非模板不同,如果是非模板的东东,编译器就要决议出func的实体。)
只有推迟到类型绑定,例如:
Pig <long> x;//才决议出,x及其公有成员func(通过x)的作用域是全局的!
void main()
{
Pig <char> y;//才决议出,x及其公有成员func(通过x)的作用域是局部的!
x.func();
y.func();
_PAUSE;
}
所以模板声明,及其定义都要放在.h之中,特别是依靠模板创建dll的时候!