旧的Alexandrescu的C ++书中的代码是否有效?

时间:2015-04-01 16:26:52

标签: c++ templates

我正在阅读关于C ++模板的旧Alexandrescu的书,并且遇到了以下代码片段,他解释了AbstractFactory模式实现(第9.3章)。这是:

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

1 个答案:

答案 0 :(得分:2)

不,您发布的代码不正确。

有一些错字可能并不相关,但我会提到它们。它们可能出现在书中,也可能是你自己制作的。我没有这本书所以我无法检查

  • GenLinearHierachy应该是GenLinearHierarchy
  • 在另一个模板参数
  • 之前,OPNewFactoryUnit末尾的逗号丢失

现在已经没有了,但该代码段内没有声明TL命名空间或template <class> class Reverse;。它确实在template <class> class Reverse;名称空间之外声明了TL,因此如果假设“整个代码段”并且没有理由认为需要额外的标题,则可能是书中的错误

该声明可能与Loki::TL::Reverse< NullType >有关,该template <class, class> class Creator = OPNewFactoryUnit在Loki图书馆的Typelist.h中声明。

我发现令人困惑的第三件事是模板参数template <class, class, class> class GenLinearHierachy作为第二个类型参数传递给Creator,即使GenLinearHierarchy不是类型而是模板!似乎template <class, template <class, class> class, class> class GenLinearHierarchy;似乎是TL。这符合LOKI::GenLinearHierarchy

通过这些更改(修复拼写错误,删除GenLinearHierarchy命名空间,更改{{1}}的类型),代码会正确解析。