2015-04-01 57 views
-2

我正在閱讀舊的Alexandrescu關於C++模板的書,並且在下面的代碼片段中解釋了AbstractFactory模式實現(第9.3章)。這裏是:此代碼是否來自舊Alexandrescu的C++書籍有效?

template <class, class, class> class GenLinearHierachy; 
template <class, class> class OPNewFactoryUnit; 
template <class> class Reverse; 

//definitions 

template 
< 
    class AbstractFact, 
    template <class, class> class Creator = OPNewFactoryUnit 
    class TList = typename AbstractFact::ProductList 
> 
class ConcreteFactory 
: public GenLinearHierarchy< 
typename TL::Reverse<TList>::Result, Creator, AbstractFact> //HERE. 
{ 
public: 
    typedef typename AbstractFact::ProductList ProductList; 
    typedef TList ConcreteProductList; 
}; 

我不明白爲什麼代碼是有效的。我們沒有在代碼段中的任何地方定義TL

+12

想象一下,如果本網站上的所有問題都有像你這樣的標題:) – keyser 2015-04-01 16:28:17

+0

你試過編譯代碼嗎?有錯別字。 – user2079303 2015-04-01 16:37:43

+4

有問題的代碼似乎也有'#include'Typelist.h「',它定義'namespace TL'。 [(參考)](http://loki-lib.sourceforge.net/html/a00644.html) – 2015-04-01 16:57:13

回答

2

不,您發佈的代碼不正確。

有幾個拼寫錯誤可能不是很相關,但我會提及它們。他們可能在書中,也可能是你在發佈時自己製作的。我沒有這本書,所以我無法檢查

  • GenLinearHierachy也許應該GenLinearHierarchy
  • 逗號在OPNewFactoryUnit年底前失蹤另一個模板參數現在

那些超出在這種情況下,沒有片段不會在該命名空間內聲明TL命名空間或template <class> class Reverse;。它確實在TL名稱空間之外聲明template <class> class Reverse;,所以假設這是整個片段,並且沒有理由認爲需要額外的頭文件,可能是本書中的錯誤。

該聲明可能與Loki庫的Typelist.h中聲明的Loki::TL::Reverse<NullType>有關。

,我覺得困惑第三件事是模板參數template <class, class> class Creator = OPNewFactoryUnit作爲第二個類型參數傳遞給template <class, class, class> class GenLinearHierachy即使Creator不是一個類型,但模板!看起來像GenLinearHierarchy將打算爲template <class, template <class, class> class, class> class GenLinearHierarchy;。這將與LOKI::GenLinearHierarchy

通過這些更改(修復拼寫錯誤,刪除TL名稱空間,更改類型GenLinearHierarchy),代碼將正確解析。