Странное противоречие. Написанное на странице 92 (класс Functor) о том, что template class’ы с тем же названием не могут иметь разное количество template параметров противоречит коду на странице 57 (класс GenScatterHierarchy) и 60 (класс FieldHelper). Если не хотите не обращайте пожалуйста внимание на количество кода а на количество template параметров. Например тут их явно разное количество и это не специализация шаблона:
// Pass an atomic type (non-typelist) to Unit
template <class AtomicType, template <class> class Unit>
class GenScatterHierarchy : public Unit<AtomicType>
{
typedef Unit<AtomicType> LeftBase;
};
// Do nothing for NullType
template <template <class> class Unit>
class GenScatterHierarchy<NullType, Unit>
{
};
А на странице 92 о классе Functor написано, что так нельзя. Я, конечно, могу сам это все компилировать и проверять, но я не настолько хорошо знаю шаблоны. Может есть какая-то тонкость?
Страница 92:
Even after making this decision, life is not a lot easier. C++ does not allow templates with the same name and different numbers of parameters. That is, the following code is invalid:
// Functor with no arguments
template <typename ResultType>
class Functor
{
...
};
// Functor with one argument
template <typename ResultType, typename Parm1>
class Functor
{
...
};
С другой стороны страница 57:
template <class TList, template <class> class Unit>
class GenScatterHierarchy;
// GenScatterHierarchy specialization: Typelist to Unit
template <class T1, class T2, template <class> class Unit>
class GenScatterHierarchy<Typelist<T1, T2>, Unit>
: public GenScatterHierarchy<T1, Unit>
, public GenScatterHierarchy<T2, Unit>
{
public:
typedef Typelist<T1, T2> TList;
typedef GenScatterHierarchy<T1, Unit> LeftBase;
typedef GenScatterHierarchy<T2, Unit> RightBase;
};
// Pass an atomic type (non-typelist) to Unit
template <class AtomicType, template <class> class Unit>
class GenScatterHierarchy : public Unit<AtomicType>
{
typedef Unit<AtomicType> LeftBase;
};
// Do nothing for NullType
template <template <class> class Unit>
class GenScatterHierarchy<NullType, Unit>
{
};
Или страница 60:
template <class H, typename R>
inline R& FieldHelper(H& obj, Type2Type<R>, Int2Type<0>)
{
typename H::LeftBase& subobj = obj;
return subobj;
}
template <class H, typename R, int i>
inline R& FieldHelper(H& obj, Type2Type<R> tt, Int2Type<i>)
{
typename H::RightBase& subobj = obj;
return FieldHelper(subobj, tt, Int2Type<i- 1>());
}
//Refer to HierarchyGenerators.h for FieldTraits' definition
template <int i, class H>
typename Private::FieldTraits<H>::At<i>::Result&
Field(H& obj)
{
typedef typename Private::FieldTraits<H>::At<i>::Result
Result;
return FieldHelper(obj, Type2Type<Result>(), Int2type<i>());
}
Тут, например, опять разное количество template параметров:
template <class H, typename R>
inline R& FieldHelper(H& obj, Type2Type<R>, Int2Type<0>)
{
typename H::LeftBase& subobj = obj;
return subobj;
}
template <class H, typename R, int i>
inline R& FieldHelper(H& obj, Type2Type<R> tt, Int2Type<i>)
{
typename H::RightBase& subobj = obj;
return FieldHelper(subobj, tt, Int2Type<i- 1>());
}