2015-05-10 69 views
2

鉴于翻译单元中的一个不完全类型:为什么我无法使用typedef来完成该类型?

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; 
} 
+6

因为你已经宣布'Incomplete'是一个类型,而不是一个类型别名。 –

+0

好吧,但我正在寻找一个权威的答案(基于标准报价) – milleniumbug

+0

哦,等等,我没有注意到你有这些作为单独的翻译单位。所以我上面的评论可能不会成立...... –

回答

3

Incomplete是一种类型,由您的声明引入,您不能使用相同名称的typedef引用另一个类型。

struct Incomplete;是一个前向类声明,它向全局范围中插入一个类名(并引入了一个新的但不完整的类型)。

§9/ 2

一个类名称被插入到其中的类名被看作之后它被立即宣布的范围。

§9。1/2

一个声明只包含class-key标识符;是对当前作用域中的名称的重新声明或作为类名称的标识符的前向声明。

为了在需要完整类型的情况下使用该名称,必须定义该名称。

§3.2/ 4

究竟一个类中的一个的定义,需要在翻译单元如果类在需要的类型是完整的方式使用。

使用类说明符定义的类ist。

§9/ 2

一类被认为限定其之后类指定符的闭括号已经看到,即使它的成员函数中一般还没有定义。

您的typedef是一个声明,并没有定义类。

§7.1.3/ 1

声明含有DECL说明符的typedef声明可以在以后用于命名基波(3.9.1)或化合物(3.9.2)类型一起使用的标识符。

§3.1/ 2

的声明是一个定义除非[...]它是一个typedef声明[...]。

鉴于同一范围/声明区域中的声明需要引用同一个实体。

§3.3.1/ 4

鉴于在单个声明性区域的一组声明的,其中的每一个指定了相同的非限定名称

  • 都必指代相同的实体或全部是指功能和功能模板; [...]

你的typedef声明IncompleteUnrelatedstruct Incomplete;声明了一个类型Incomplete

§7.1。3/6

在给定的范围内,一个typedef说明符不得用于重新定义在该范围内声明来指代不同的类型的任何类型的名称。

C++ 11

+0

谢谢,这正是我所寻找的(特别是“他们都应该指同一个实体”部分)。 – milleniumbug

1

无法完成的东西,是在不同的翻译单元声明。你可以在第二个文件中找到你的第一个文件,在这种情况下,你可以在单个翻译单元中找到所有的东西,或者,如果你不是#include它,你只需要一个typedef,在单元B中没有不完整的类型, (你永远不要完成,因为你不必)单位A.

而且你不能完成一类具有在一个单元一个typedef,因为:

3.9 0.5。已声明类但未定义或未知 大小或不完整元素类型的数组是一个未完成定义的对象 类型。不完全定义的对象类型和空缺类型为 不完整类型

3.9.2。声明是定义除非< ...>它是typedef声明,< ...>。

N3337;一些重点由我加。)

所以,你不能完成课程类型与typedef,因为一个类类型可以通过定义typedef声明只完成不是一个定义。

+0

我提高了你的答案,因为它帮助我理解了这个问题。 – milleniumbug

相关问题