[英]Why can't I complete the type with the typedef?
鉴于翻译单元A中的类型不完整:
struct Incomplete;
Incomplete* create_incomplete();
void destroy_incomplete(Incomplete*);
为什么我不能通过使用typedef
在另一个翻译单元中使用它?
例如,在翻译单元B中:
struct Unrelated
{
int x;
int y;
};
typedef Unrelated Incomplete;
Incomplete* create_incomplete()
{
return new Incomplete();
}
void destroy_incomplete(Incomplete* arg)
{
delete arg;
}
Incomplete
是一种类型,由您的声明引入,您不能使用相同名称的typedef,引用另一种类型。
你的struct Incomplete;
是一个前向类声明,它将类名插入到全局范围中(并引入了一个新的但不完整的类型)。
§9/ 2
在看到类名后立即将类名插入到作用域中。
第9.1节/ 2
仅由类密钥标识符组成的声明; 是对当前作用域中名称的重新声明,或者是作为类名称的标识符的前向声明。
为了在需要完整类型的地方使用该名称,必须对其进行定义。
§3.2/ 4
如果以需要类类型完整的方式使用类,则在翻译单元中需要一个类的正确定义。
使用类说明符定义类。
§9/ 2
一个类被认为是在看到它的类说明符的右括号之后定义的,即使它的成员函数通常尚未定义。
您的typedef是一个声明,不定义该类。
§7.1.3/ 1
包含decl-specifier typedef的声明声明了以后可用于命名基本(3.9.1)或复合(3.9.2)类型的标识符。
§3.1/ 2
声明是一个定义,除非它是一个typedef声明[...]。
而在同一范围/声明区域中的声明需要引用同一实体。
§3.3.1/ 4
给定一个声明区域中的一组声明,每个声明区域指定相同的非限定名称
- 它们都应指同一实体,或全部指功能和功能模板; [...]
你的typedef声明Incomplete
引用不Unrelated
而struct Incomplete;
声明类型Incomplete
。
§7.1.3/ 6
在给定范围内,typedef说明符不得用于重新定义在该范围内声明的任何类型的名称以引用其他类型。
C ++ 11
您无法完成在不同翻译单元中声明的内容。 要么#include
你的第一个文件在第二个文件中,在这种情况下,你把所有事情都发生在一个翻译单元中,或者,如果你不#include
它,你只需要一个typedef
并且单元B中没有不完整的类型,在单元A中不完整的类型(你没有完成,因为你没有必要)。
并且您无法在单个单元中完成具有typedef
的类,因为:
3.9.5。 已声明但未定义的类 ,或未知大小或不完整元素类型的数组,是未完全定义的对象类型。 未完全定义的对象类型和void类型是不完整的类型 。
3.9.2。 声明是一个定义,除非<...>是一个
typedef
声明,<...>。
( N3337 ;一些重点由我添加。)
因此,您无法使用typedef
完成类类型,因为类类型只能通过定义完成,而typedef
声明不是定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.