2015-05-10 84 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

相關問題