2012-09-11 74 views
5

有人可以給一個提示如何做編譯過程表達式,如C++模板代碼順序解析/ CRTP

class DerivedA: public ParentTemplateClass<DerivedA>{ 
} 

對於MEE它看起來像:

這個男孩的父親是這個男孩的「兒子」

我的意思是,我不明白DerivedA類的「解析」是如何完成的,而無需知道父類的確切「描述」。似乎'它不能。所以父母的班級必須在孩子面前進行處理,但在這種情況下,父母依賴於孩子......而我被困在那裏。

是的,網上有一些文章描述了這種東西的用法,例如,一篇關於好奇地反覆出現的模板模式的文章( http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern),但那不是某種類似的標準模式或模糊模式。必須有明確的行爲描述,如操作順序是不是?

答案: Thnx給大家。是的,向前的decl比喻似乎對我停止破壞我的大腦合法。模板仍然是我的藝術原因,因爲它的隱藏子語言性質,我不能只是g ++ -E :)

+1

想到這一點,就好像它是一個前向聲明。 – PlasmaHH

+0

我認爲這是因爲「男孩的父親是根據這個特定的兒子來定義的。「我不是CRTP的粉絲 - 我懷疑它是過度使用的 - 但是對特定CRTP代碼的解釋是相對直接的。在輸入對象可以被實例化之前,模板總是被完全展開。」 – aSteve

+0

「模板總是在之前完全展開類型化的對象可以被實例化「是的,似乎是合法的。對我來說,某種模糊效果是因爲在編譯期間實例化了Temaplate,而不是預處理。 – sohel

回答

6

當您的代碼顯示爲class DerivedA後,將聲明符號DerviedA。它可以用作模板參數。 C++編譯器會對代碼進行幾次傳遞,因此在解析編譯器時,它會「相信」你的意圖是正確的,並且它最終將獲得該類的定義(當它將要實例化模板時,即你實際上使用該類型)。如果沒有,它會在那一刻抱怨。如果您在聲明中使用了前向聲明的類,但在使用它之前未提供定義,則會發生類似的情況。

1

我認爲要理解這是如何工作的,您通常需要更多地瞭解C++模板,而不僅僅是好奇的循環模板模式。其他人可能會比我更好地回答這個問題,但我知道C++本身不能完全解析模板類定義。它每次在代碼中使用它時都會實例化模板。如果每個類是在一個獨立的包含文件,認爲它是這樣的:

#include "ParentTemplateClass.h" // C++ initially validates the template class definition's syntax. 
#include "DerivedA.h" // First use of ParentTemplateClass - 
         // at this point it becomes fully instantiated. 

的C++解析器將首先驗證模板語法時,看到的模板定義。然後,當模板被用作DerivedA的基礎時,解析繼續並且模板被完全實例化。當然,這是C++編譯器將執行的解析的簡化視圖,我確信細節因編譯器而異。另見http://womble.decadent.org.uk/c++/template-faq.html#disambiguation

3

在模板實例化的點上,DerivedA不完整;它已被宣佈爲,但還未完全定義爲。不完整的類型可以以各種方式使用 - 例如,可以聲明指針或對它們的引用,用它們聲明函數作爲返回值或參數類型以及其他一些內容。你不能創建對象,從它們繼承,訪問它們的成員,或者通常做任何需要更多信息而不僅僅是類名的東西。

只要類模板只做這些事情,沒有問題。