2014-12-01 107 views
0

我尋找http://trac.webkit.org/browser/trunk/Source/JavaScriptCore/parser/Lexer.hhttp://trac.webkit.org/browser/trunk/Source/JavaScriptCore/parser/Lexer.cpp
。在管線196的標題,有一段代碼理解C++模板代碼

template <bool shouldBuildIdentifiers> ALWAYS_INLINE JSTokenType parseIdentifier(JSTokenData*, unsigned lexerFlags, bool strictMode); 

我可以看到一個實施本在CPP文件作爲

template <> 
template <bool shouldCreateIdentifier> ALWAYS_INLINE JSTokenType Lexer<LChar>::parseIdentifier(JSTokenData* tokenData, unsigned lexerFlags, bool strictMode) 

我對語法的理解是,我們定義/專業的功能型LChar的詞法分析器。它是否正確? 我讀了(Why can templates only be implemented in the header file?)這應該在頭文件中理想地完成。

也做舊的C++編譯器支持這種語法?我的是mips-linux-g ++ v 4.1.0。我得到一個「模板id不匹配任何模板聲明」

回答

1

你的理解是正確的。 bool仍然可以根據方法的模板進行變化,專業化是針對課程的。

雖然一般模板是專門和在頭文件來實現,另一種是添加一個正向聲明的專業化,編譯器會發現它。然而,實現必須從另一個文件鏈接,就像任何其他具有單獨聲明和定義的函數一樣。這有缺點,即在沒有鏈接時間優化的情況下,內聯不會發生,但有利的是,無論何時使用模板,都需要分析更少的代碼。在大型項目中,這可以顯着提高編譯時間。

在這種情況下,類的實施者已經決定,只有真正的兩種方式這一類將永遠被實例化,與LChar和UCHAR(見行1930年的評論)。因此,他們可以將它們的實現放在.cpp文件中,並通過在文件底部實例化兩個模板,在該階段解決所有問題。

模板可以被用來實現(如std::vector)是奢望什麼完全通用類,但也可以在一個虛擬的方法的地方,當你認爲這是不太可能,你將需要比實現的一把更被使用受益於代碼重用。

至於G ++ 4.1.0,我只是檢查,看到這是近9歲!從那以後,與模板有關的So many bugs已經得到修復,如果您對它們做了任何不重要的事情,那麼確實需要升級。

+0

「bool仍然可以根據方法的模板進行變化,專業化是針對課程的。」這是什麼意思?返回類型是bool嗎? – jogabonito 2014-12-02 02:34:46

+0

在這種情況下,總共有兩個模板參數。一個適用於類('T'在'模板類Lexer'),第二個是在方法('布爾shouldCreateIdentifier')。我們將'T'設置爲'LChar',但我們仍然讓'shouldCreateIdentifier'採取不同的值。這也被稱爲部分專業化。 – 2014-12-02 10:20:19

+0

這是否意味着shouldCreateIdentifier可以有一些類型而不是bool? – jogabonito 2014-12-02 12:33:00