我正在阅读关于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
。
答案 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}}的类型),代码会正确解析。