我是MPL的初学者,所以我可能完全误解了如何使用它,但我已经尝试了所有我能想到的让这个工作 .

首先,我正在努力实现的目标 . 我有一堆形式的类:

class X
{
  typedef mpl::vector< D1,...,Dn > dependencies;
  ...
}

其中n可以是0(无依赖性),Di也是相同形式的类 . 我的目标是定义一个元函数

template < typename T >
struct unroll_dependencies
{
  typedef ??? type;
}

这样'type'将是一个包含T及其所有(递归)依赖的MPL序列,没有重复,并确保任何类总是在序列中的依赖之后 .

到目前为止,我的尝试如下(到目前为止,我忽略了重复问题):

template < typename T, typename Enable = void >
struct unroll_dependencies
{
  typedef T t;
  typedef typename t::dependencies t_dep;

  // For each dependency class Di of T, recursively unroll its dependencies
  typedef typename mpl::fold<
    t_dep,
    mpl::vector0<>,
    mpl::lambda<
      mpl::copy<
        typename unroll_dependencies< _2 >::type,  // <-- Compiler error here
        mpl::back_inserter< _1 >
      >
    >
  >::type dep_types;

  // Finally, add T itself after its dependencies
  typedef typename mpl::push_back< dep_types, t >::type type;
};

// Termination case for when a class has no dependencies
template < typename T >
struct unique_dependencies< T, typename boost::enable_if< mpl::empty< typename T::dependencies > >::type >
{
  // A sequence containing T alone
  typedef mpl::vector1< T > type;
};

使用VC2012,我在标记的行上出现编译器错误:

错误C2146:语法错误:在标识符'type'之前缺少','

我不太清楚lambda和占位符是如何工作的,但我猜这与它与导致问题的递归定义的组合有关 . 任何人都可以解释我收到此错误的原因吗?我完全以错误的方式解决这个问题吗?