关于模板声明及其定义
2011-03-13 09:46
120 查看
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的时候!
模板,包括模板函数及有成员函数的模板类,其声明连同定义都应该放在.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的时候!
相关文章推荐
- 关于C++泛型编程,模板声明和定义最好在同一个文件的解释。
- 关于模板类中模板成员函数在类定义外部特化报错,错为声明与定义不匹配
- 模板的实例化-关于在模板声明和使用处有同名函数时的选择原则
- 关于C中函数声明与定义
- 关于js二维数组和多维数组的定义声明(详解)
- 模板类定义时,模板方法定义与声明的分离
- 关于网络流的一些基本名词及其定义。
- C中关于声明和定义的说明
- 在类模板的声明和定义中把.h与.cpp分离
- 关于C/C++中 Class, Struct, enum的定义声明位置
- thinkphp——关于前台模板显示顶级栏目及其对应所有商品分页和二级栏目及对应的商品分页
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- 在类模板的声明和定义中把.h与.cpp分离
- 如何两个模板类会相互包含,那么需要在类定义之前声明其中一个类,并且声明时要用模板。
- 模板定义与声明需要一起放在头文件中原因的理解
- 关于作为函数参数的多维数组的声明、定义和调用
- 关于C++模板封装的问题(关于C++模板参数的声明)
- 关于函数模板在类模板中声明为友元的一些心得
- 关于GDAL库CPLstringList类的声明和定义问题
- 关于 c语言中的声明和定义