定义
不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象。也就是说,如果在编译期编译器能计算出一个类型的size,那么它就是一个完整类型,否则就是不完整类型
事实上我们在实际的工程设计中经常使用不完整类型,只不过不知道有这么个概念而已。前向声明就是一种常用的不完整类型:
class base;
struct test;
base和test只给出了声明,没有给出定义。不完整类型必须通过某种方式补充完整,才能使用它们进行实例化,否则只能用于定义指针或引用,因为此时实例化的是指针或引用本身,不是base或test对象。
一个未知长度的数组也属于不完整类型:
extern int a[];
extern不能去掉,因为数组的长度未知,不能作为定义出现。
例子
比如如下的向前声明,编译器遇到它时,并无法判断student这个类型有占用多大的空间,所以它就是一个不完整类型:
struct student *ps;
当编译器遇到student的定义时它就成了一个完整类型
struct student
{
int num;
}
如何判断一个类型是完整类型(complete type)
只要对一个类型sizeof(T)能正确计算,这个T就是一个完整类型。
所以判断T是否为完整类型的模板函数就可以写成如下的样子:
其他
类的向前声明
- 类的向前声明简单地说就是告诉当前文件有这么一个类。但这个类的具体结构,成员函数什么的都是未知的。仅能用于在当前文件声明类的引用或指针,不能具体实例化这个类。因为这个了的情况位置