Hello.

I am trying to instantiate a template taking two parameters across a series of types contained in mpl::vector's, and place the resulting types in an mpl::vector.

template <class A, class B> class T {};
typedef mpl::vector<int, double, char> Atypes;
typedef mpl::vector<double, std::string> Btypes;

template <template <class, class> class TEMPLATE,
   class ATYPE,
   class BTYPES,
   class CLASSES>
struct unary_fold_inner : mpl::fold<
   BTYPES,
   CLASSES,
   mpl::push_back<mpl::_1, TEMPLATE<ATYPE, mpl::_2> >
> {};

template <template <class, class> class TEMPLATE,
   class ATYPES,
   class BTYPES>
struct unary_fold : mpl::fold<
   ATYPES,
   mpl::vector<>,
   typename detail::unary_fold_inner<TEMPLATE, mpl::_2, BTYPES, mpl::_1>::type
> {};

typedef unary_fold<
   T,
   Atypes,
   Btypes
>::type CLASSES;

I expect CLASSES will be an mpl::vector containing 2x3=6 types as follows:
T<int, double>
T<int, std::string>
T<double, double>
T<double, std::string>
T<char, double>
T<char, std::string>

in other words, instantiating template T across all permutations of Atypes and Btypes.

What I see instead is puzzling. Classes is indeed an mpl::vector, and indeed contains 6 types, but the types are simply:
T<double, double>
T<std::string, std::string>
T<double, double>
T<std::string, std::string>
T<double, double>
T<std::string, std::string>

The iteration I'm trying to accomplish is all wrong. I think it has to do with how I'm creating my metafunctions. I'm still unclear about when the ::type suffix is needed (for the last parameter to mpl::fold<> for example) and whether I need an "apply" template somewhere in my struct's.

Any help appreciated.

v