我引用了一个模板类,将它放入一个mpl :: vector中:
boost::mpl::vector<int, boost::mpl::quote2<std::pair>>
然后,我得到了第二个元素:
using A=typename boost::mpl::at<T, boost::mpl::int_<2>>::type;
我现在需要将原始模板类传递给类似这样的类:
template<class A, template<class, class> class C>
class B{
C<A, B*> _c;
};
我尝试使用apply或bind,但找不到让B接受第二个参数的方法。
我得到了那种错误:
error: template argument for template template parameter must be a class template or type alias template
编辑:
示例代码:
#include <boost/mpl/vector.hpp>
#include <boost/mpl/quote.hpp>
#include <boost/mpl/at.hpp>
template<class, class> class A{};
template<class A, template<class, class> class C>
class B{
C<A, B*> _c;
};
using T=boost::mpl::vector<int, boost::mpl::quote2<A>> ;
using T1=typename boost::mpl::at<T, boost::mpl::int_<0>>::type;
using T2=typename boost::mpl::at<T, boost::mpl::int_<1>>::type;
int main(){
B<T1, T2> b;
return 0;
}
我明白了:
error: template argument for template template parameter must be a class template or type alias template B<T1, T2> b;
答案 0 :(得分:2)
MPL仍然主要是C ++ 03 lib AFAIK,你试图让它在C ++ 11之前生成一些在概念上不存在的东西。我怀疑在这种情况下让quote
工作是语法的巧合,而不是预期的功能。
以下代码在VC2013中成功编译:
#include <boost/mpl/vector.hpp>
#include <boost/mpl/quote.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/at.hpp>
template<class, class> class A{};
template<class A, template<class, class> class C>
class B{
C<A, B*> _c;
};
using T = boost::mpl::vector < int, boost::mpl::quote2<A> > ;
using T1 = boost::mpl::at<T, boost::mpl::int_<0>>::type;
using T2 = boost::mpl::at<T, boost::mpl::int_<1>>::type;
template<typename X1, typename X2>
using TT2 = typename boost::mpl::apply<T2, X1, X2>::type;
int main(int argc, char* argv[])
{
B<T1, TT2> b;
return 0;
}