boost mpl fold 占位符表达式编译失败
boost mpl fold placeholder expression fails to compile
我正在尝试从 boost-mpl(位于 libs/mpl/examples/fsm/player2.cpp)编译 Statemachine 示例,但它在 boost 版本 1.37 和 g++ 4.8.2 中失败。使用 boost 版本 1.56 和相同的编译器,构建成功。不幸的是,由于某些平台限制,我无法切换到 1.56 版本。
我不希望任何人研究上面提到的冗长示例,因此我确定了一个最小的代码片段来说明问题:
#include <boost/mpl/fold.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/placeholders.hpp>
namespace mpl = boost::mpl;
using namespace mpl::placeholders;
//Basic queue datatype
template< class CURRENT, class NEXT >
struct queue_element
{
typedef typename CURRENT::mytype mytype;
};
//type to be put at the end of the queue
struct default_queue_element
{
};
template <class TYPE>
struct wrapper{
typedef TYPE mytype;
};
typedef mpl::vector<wrapper<int>, wrapper<char> > myvector;
//the following fold expression should create this type:
typedef queue_element<wrapper<char>, queue_element<wrapper<int>,
default_queue_element> > this_type_should_be_created;
//This typedef fails to compile with boost Version 1.37,
//but works perfectly with version 1.56
typedef typename
mpl::fold<
myvector
,default_queue_element
,queue_element<_2,_1>
>::type
generate_queue;
使用 boost 1.37,g++ 会出现以下错误:
foldtest2.cpp: In instantiation of ‘struct queue_element<mpl_::arg<2>, mpl_::arg<1> >’:
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:85:5: required from ‘const int boost::mpl::aux::template_arity_impl<queue_element<mpl_::arg<2>, mpl_::arg<1> >, 1>::value’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:93:5: required from ‘const int boost::mpl::aux::template_arity<queue_element<mpl_::arg<2>, mpl_::arg<1> > >::value’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:98:30: required from ‘struct boost::mpl::aux::template_arity<queue_element<mpl_::arg<2>, mpl_::arg<1> > >’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/apply.hpp:67:8: required from ‘struct boost::mpl::apply2<queue_element<mpl_::arg<2>, mpl_::arg<1> >, default_queue_element, wrapper<int> >’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp:67:85: required from ‘struct boost::mpl::aux::fold_impl<2, boost::mpl::v_iter<boost::mpl::vector<wrapper<int>, wrapper<char> >, 0l>, boost::mpl::v_iter<boost::mpl::vector<wrapper<int>, wrapper<char> >, 2l>, default_queue_element, queue_element<mpl_::arg<2>, mpl_::arg<1> > >’
../boost_1_37_0/boost/mpl/fold.hpp:39:18: required from ‘struct boost::mpl::fold<boost::mpl::vector<wrapper<int>, wrapper<char> >, default_queue_element, queue_element<mpl_::arg<2>, mpl_::arg<1> > >’
foldtest2.cpp:39:6: required from here
foldtest2.cpp:15:38: error: no type named ‘mytype’ in ‘struct mpl_::arg<2>’
typedef typename CURRENT::mytype mytype;
是否有解决方法可以使代码使用 boost 1.37 进行编译?我已经在网上搜索了很长一段时间。如果问题已经在某处得到解答,请指出这一点,我将不胜感激。
看起来很简单,只是那个古老 (¹) 版本的 boost 中的一个错误。
快速二分法告诉我它已在 v1.43.0(²) 中修复。 Release notes 不要泄露秘密,但 git 会:
- c5621d9 MPL:合并修复工单 #1992 boost::mpl::zip_view does not support use as a metafunction with ::type
- 31a2c78 MPL:合并修复工单 #4061 [MPL] gcc-4.5 compilation problems related to arity_helper
显然是后者(通过针对 31a2c78 进行编译确认)。
所以你在 include/boost/mpl/aux_/template_arity.hpp(³) 中修复了这一行:
sizeof(arity_helper(type_wrapper<F>(),arity_tag<N>())) - 1
应该是
sizeof(::boost::mpl::aux::arity_helper(type_wrapper<F>(),arity_tag<N>())) - 1
当然,解决这个问题的正确方法是使用受支持的 boost 版本
¹(2008 年 11 月 3 日)!!
²(2010 年 5 月 6 日)
³ 警告:也存在于 header
的预处理版本中生成的多个副本中
我正在尝试从 boost-mpl(位于 libs/mpl/examples/fsm/player2.cpp)编译 Statemachine 示例,但它在 boost 版本 1.37 和 g++ 4.8.2 中失败。使用 boost 版本 1.56 和相同的编译器,构建成功。不幸的是,由于某些平台限制,我无法切换到 1.56 版本。
我不希望任何人研究上面提到的冗长示例,因此我确定了一个最小的代码片段来说明问题:
#include <boost/mpl/fold.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/placeholders.hpp>
namespace mpl = boost::mpl;
using namespace mpl::placeholders;
//Basic queue datatype
template< class CURRENT, class NEXT >
struct queue_element
{
typedef typename CURRENT::mytype mytype;
};
//type to be put at the end of the queue
struct default_queue_element
{
};
template <class TYPE>
struct wrapper{
typedef TYPE mytype;
};
typedef mpl::vector<wrapper<int>, wrapper<char> > myvector;
//the following fold expression should create this type:
typedef queue_element<wrapper<char>, queue_element<wrapper<int>,
default_queue_element> > this_type_should_be_created;
//This typedef fails to compile with boost Version 1.37,
//but works perfectly with version 1.56
typedef typename
mpl::fold<
myvector
,default_queue_element
,queue_element<_2,_1>
>::type
generate_queue;
使用 boost 1.37,g++ 会出现以下错误:
foldtest2.cpp: In instantiation of ‘struct queue_element<mpl_::arg<2>, mpl_::arg<1> >’:
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:85:5: required from ‘const int boost::mpl::aux::template_arity_impl<queue_element<mpl_::arg<2>, mpl_::arg<1> >, 1>::value’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:93:5: required from ‘const int boost::mpl::aux::template_arity<queue_element<mpl_::arg<2>, mpl_::arg<1> > >::value’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp:98:30: required from ‘struct boost::mpl::aux::template_arity<queue_element<mpl_::arg<2>, mpl_::arg<1> > >’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/apply.hpp:67:8: required from ‘struct boost::mpl::apply2<queue_element<mpl_::arg<2>, mpl_::arg<1> >, default_queue_element, wrapper<int> >’
../boost_1_37_0/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp:67:85: required from ‘struct boost::mpl::aux::fold_impl<2, boost::mpl::v_iter<boost::mpl::vector<wrapper<int>, wrapper<char> >, 0l>, boost::mpl::v_iter<boost::mpl::vector<wrapper<int>, wrapper<char> >, 2l>, default_queue_element, queue_element<mpl_::arg<2>, mpl_::arg<1> > >’
../boost_1_37_0/boost/mpl/fold.hpp:39:18: required from ‘struct boost::mpl::fold<boost::mpl::vector<wrapper<int>, wrapper<char> >, default_queue_element, queue_element<mpl_::arg<2>, mpl_::arg<1> > >’
foldtest2.cpp:39:6: required from here
foldtest2.cpp:15:38: error: no type named ‘mytype’ in ‘struct mpl_::arg<2>’
typedef typename CURRENT::mytype mytype;
是否有解决方法可以使代码使用 boost 1.37 进行编译?我已经在网上搜索了很长一段时间。如果问题已经在某处得到解答,请指出这一点,我将不胜感激。
看起来很简单,只是那个古老 (¹) 版本的 boost 中的一个错误。
快速二分法告诉我它已在 v1.43.0(²) 中修复。 Release notes 不要泄露秘密,但 git 会:
- c5621d9 MPL:合并修复工单 #1992 boost::mpl::zip_view does not support use as a metafunction with ::type
- 31a2c78 MPL:合并修复工单 #4061 [MPL] gcc-4.5 compilation problems related to arity_helper
显然是后者(通过针对 31a2c78 进行编译确认)。
所以你在 include/boost/mpl/aux_/template_arity.hpp(³) 中修复了这一行:
sizeof(arity_helper(type_wrapper<F>(),arity_tag<N>())) - 1
应该是
sizeof(::boost::mpl::aux::arity_helper(type_wrapper<F>(),arity_tag<N>())) - 1
当然,解决这个问题的正确方法是使用受支持的 boost 版本
¹(2008 年 11 月 3 日)!!
²(2010 年 5 月 6 日)
³ 警告:也存在于 header
的预处理版本中生成的多个副本中