首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost::从Boost 1.49移到Boost 1.54时的精神编译器错误

Boost::从Boost 1.49移到Boost 1.54时的精神编译器错误
EN

Stack Overflow用户
提问于 2014-01-07 17:54:33
回答 1查看 628关注 0票数 2

我有一种简单的语法,用Boost::Spirit来写,定义如下:

代码语言:javascript
复制
template <typename Iterator_T>
struct my_grammar :
qi::grammar<Iterator_T, vector<basic_value_t>(), qi::locals<size_t> >
{
  my_grammar();

  qi::rule<Iterator_T, vector<basic_value_t>(), qi::locals<size_t> > start;
  qi::rule<Iterator_T, basic_value_t(), qi::locals<size_t> > ptuple;
};

template <typename Iterator_T>
my_grammar<Iterator_T>::
my_grammar() : my_grammar<Iterator_T>::base_type(start), start(), ptuple() {
  start = (*ptuple);

  ptuple
    = (qi::byte_ >>
       qi::omit[qi::byte_[qi::_a = qi::_1]] >>
       qi::repeat(qi::_a)[qi::byte_])
    ;
}

basic_value_t定义为:

代码语言:javascript
复制
struct basic_value_t {
  uint8_t type;        
  vector<uint8_t> val;
};

在BOOST_FUSION_ADAPT_STRUCT中包装为:

代码语言:javascript
复制
BOOST_FUSION_ADAPT_STRUCT
(
 basic_value_t,
 (std::uint8_t, type)
 (std::vector<std::uint8_t>, val)
)

然后用以下语句初始化语法:

代码语言:javascript
复制
my_grammar<vector<uint8_t>::const_iterator> grammar;

在这一行中,我在使用boost 1.54编译代码时出错。但是,如果使用boost 1.49编译相同的代码,则不会出现错误。尽我所能,我有一个微妙的bug,只有在我移动到更新版本的Boost时才会显示出来。

下面是非常长的错误消息序列的最后一部分错误。

代码语言:javascript
复制
/home/making/Dev/filename.cpp:498:51: required from here
/usr/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp:36:79: error: no type named ‘type’ in ‘struct boost::mpl::apply<boost::fusion::detail::apply_transform_result<boost::spirit::traits::build_attribute_sequence<boost::fusion::cons<boost::spirit::qi::any_binary_parser<boost::spirit::qi::detail::integer<8>, (boost::spirit::endian::endianness)2, 8>, boost::fusion::cons<boost::spirit::qi::omit_directive<boost::spirit::qi::action<boost::spirit::qi::any_binary_parser<boost::spirit::qi::detail::integer<8>, (boost::spirit::endian::endianness)2, 8>, boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval, boost::fusion::vector<boost::spirit::local_variable<0>, boost::spirit::argument<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > > > >, boost::fusion::cons<boost::spirit::qi::lazy_directive<boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::detail::function_eval<1>, boost::fusion::vector<boost::phoenix::value<boost::spirit::terminal<boost::spirit::tag::repeat> >, boost::spirit::local_variable<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >, boost::spirit::qi::any_binary_parser<boost::spirit::qi::detail::integer<8>, (boost::spirit::endian::endianness)2, 8>, boost::spirit::unused_type>, boost::fusion::nil> > >, boost::spirit::context<boost::fusion::cons<ccss_protocols::iec61850::basic_value_t&, boost::fusion::nil>, boost::fusion::vector1<long unsigned int> >, boost::spirit::traits::sequence_attribute_transform, __gnu_cxx::__normal_iterator<const unsigned char*, std::vector<unsigned char> >, boost::spirit::qi::domain>::element_attribute>, boost::spirit::qi::lazy_directive<boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::detail::function_eval<1>, boost::fusion::vector<boost::phoenix::value<boost::spirit::terminal<boost::spirit::tag::repeat> >, boost::spirit::local_variable<0>, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> > >, boost::spirit::qi::any_binary_parser<boost::spirit::qi::detail::integer<8>, (boost::spirit::endian::endianness)2, 8>, boost::spirit::unused_type>, mpl_::na, mpl_::na, mpl_::na, mpl_::na>’
             typedef typename mpl::apply<transform_type, value_type>::type type;
                                                                           ^
make[2]: *** [CMakeFiles/ccss-protocols-iec61850.dir/src/goose/application-layer.cpp.o] Error 1

预先感谢您对此错误的考虑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 20:50:44

下定义

代码语言:javascript
复制
#define BOOST_SPIRIT_USE_PHOENIX_V3

修复它,如链接示例所示(感谢@cv_and_he)

在这个现有的答案中记录的原因是:

下面是一个完整的示例,供将来参考:在柯尔鲁上直播

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <vector>

//#define BOOST_SPIRIT_USE_PHOENIX_V3

#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi = boost::spirit::qi;

struct basic_value_t {
  uint8_t type;        
  std::vector<uint8_t> val;
};


BOOST_FUSION_ADAPT_STRUCT
(
 basic_value_t,
 (std::uint8_t, type)
 (std::vector<std::uint8_t>, val)
)

template <typename Iterator_T>
struct my_grammar :
qi::grammar<Iterator_T, std::vector<basic_value_t>() >
{
  my_grammar();

  qi::rule<Iterator_T, std::vector<basic_value_t>() > start;
  qi::rule<Iterator_T, basic_value_t(), qi::locals<size_t> > ptuple;
};

template <typename Iterator_T>
my_grammar<Iterator_T>::
my_grammar() : my_grammar<Iterator_T>::base_type(start), start(), ptuple() {
  start = (*ptuple);

  ptuple
    %= (qi::byte_ >>
       qi::omit[qi::byte_[qi::_a = qi::_1]] >>
       qi::repeat(qi::_a)[qi::byte_])
    ;
}

int main()
{
    std::vector<std::uint8_t> test = {1,3,1,2,3};
    my_grammar<std::vector<std::uint8_t>::const_iterator> grammar;

    std::vector<std::uint8_t>::const_iterator iter = test.begin(), end = test.end();

    std::vector<basic_value_t> parsed_value_vector;

    bool result = qi::parse(iter,end,grammar,parsed_value_vector);

    if(result && iter==end)
    {
        std::cout << "Success: Type=" << static_cast<int>(parsed_value_vector[0].type) << "; Vals= ";
        for(int num : parsed_value_vector[0].val)
            std::cout << num << ".";
        std::cout << std::endl;
    }
    else
    {
        std::cout << "Failure." << std::endl;
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20978491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档