2012-08-12 74 views
1

剛纔看到它heretypedef類Smth是什麼意思?

從來沒有遇到過這樣的建築,我不明白,這是什麼意思!它是如何工作的專業化,作爲類型定義不產生新類型:

錯誤:

template <typename T> 
void a(); 
typedef int a_t; 
typedef int b_t; 
template<> void a<a_t>(){} 
template<> void a<b_t>(){} 

編譯有警告:'typedef' was ignored in this declaration,按預期工作:

template <typename T> 
void a(); 
typedef class a_t; 
typedef class b_t; 
template<> void a<a_t>(){} 
template<> void a<b_t>(){} 

回答

1

我終於理解了,它是如何工作的。

typedef class a_t; 

不像

typedef int a_t; 

但像

typedef int; 

所以,我向前聲明class a_t,然後typedef「它ð不了了之。它還解釋了警告`typedef' was ignored in this declaration和所有模板相關的東西。

+0

如果您提出的一段代碼會產生編譯器警告或其他診斷信息,請*在您的問題中包含該信息。 – 2012-08-12 21:07:47

+0

@KeithThompson,修好了! – Lol4t0 2012-08-12 21:11:41

4

這意味着沒什麼,你最好別寫。給typedef一個合適的名字,如果你想要

typedef class a_t a_t; 

雖然我沒有看到任何好處。最近更換爲C++的AC程序員可能會傾向於這樣做,因爲在C中,您不能通過簡單命名來引用類名(「C標記」中的「tag」),但必須在標籤類型前加上前綴(「struct a_t」或「union a_t」),或者爲其制定typedef。但是即使在這種情況下,程序員之後也會忘記名稱:)

在C++中不需要。在C++中,typedef名稱和類名的存在並不是通過將這些名稱保留在不同的「名稱空間」中來解決的(可以這麼說,用C語言來說,每個「名稱空間」都有一種「語法消歧」。所以你可以說「foo」和「struct foo」和「goto foo」,每次「foo」可能是完全不同的實體)。在C++中,typedef名稱將替換純類名稱,因此名稱「a_t」同時是 - typedef名稱和類名稱。

至於Standardese,我們對此有一個問題,請參閱http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#157

+0

那麼,我隱式地轉發聲明的未命名的類,並使其typedef呢? – Lol4t0 2012-08-12 20:46:31

+0

@ Lol4t0我不知道它在做什麼。這是無效的,或者這些年來我一直在思念C++的一些非常令人興奮的功能。 – 2012-08-12 20:49:24

+0

你是什麼意思無效?我同意它瘋狂,但'gcc'接受它與'-pedantic -ansi' – Lol4t0 2012-08-12 20:53:11

1

這不是對標題問題的回答(約翰尼斯的解釋在這一點上是明確的),而是對你所看到的失敗的解釋。

你的第一套代碼失敗的原因是因爲a_tb_t是同一類型(int),所以你要創建的a<int>兩個定義,這就是編譯器抱怨。

在第二個示例中,您聲明瞭兩種不同的類型(每個都是不同的class的名稱)。所以,你正在創建兩個不同的功能,a<a_t>a<b_t>