首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法转换boost::融合结构( boost::variant )中的boost::variant,同时使用boost::spirit

无法转换boost::融合结构( boost::variant )中的boost::variant,同时使用boost::spirit
EN

Stack Overflow用户
提问于 2012-12-06 20:14:03
回答 1查看 582关注 0票数 2

一天中的美好时光!

我编写了这段代码,希望它能够被编译。

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

#include <boost/spirit/include/qi.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/variant/recursive_variant.hpp>
#include <boost/fusion/include/adapted.hpp>

struct ParsedThunk
{
    typedef boost::variant<std::string, boost::tuple<boost::recursive_wrapper<ParsedThunk>, boost::recursive_wrapper<ParsedThunk> > > ParsedThunkEntity;
    ParsedThunkEntity _entity;
};

BOOST_FUSION_ADAPT_STRUCT(
    ParsedThunk,
    (ParsedThunk::ParsedThunkEntity, _entity)
)

class ThunkParser
{
protected:
    boost::spirit::qi::rule<std::string::iterator, ParsedThunk(), boost::spirit::ascii::space_type> _thunkRule;

public:
    ThunkParser()
    {
        _thunkRule %= (
            (boost::spirit::qi::lexeme[+(boost::spirit::qi::char_ - boost::spirit::qi::char_(" =()"))]) | 
            (boost::spirit::qi::lit("(") >> _thunkRule >> _thunkRule >> boost::spirit::qi::lit(")")) | 
            (_thunkRule >> _thunkRule)
            ) >> boost::spirit::qi::eps;
    }
};

int main(void)
{
    return 0;
}

但是当我用clang或者用GCC编译它时,我会得到一个错误。其中最有趣的部分是:

代码语言:javascript
复制
/usr/include/boost/variant/detail/initializer.hpp:89:24: note: candidate function not viable: no known conversion from 'const boost::fusion::vector2<ParsedThunk, ParsedThunk>' to 'const
      boost::tuples::tuple<boost::recursive_wrapper<ParsedThunk>, boost::recursive_wrapper<ParsedThunk>, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
      boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>' for 2nd argument;
            static int initialize(void* dest, param_T operand)

我用的是clang 3.1或gcc 4.7,并提高了1.52,但我认为这并不重要。:)

我应该如何编辑这段代码以使其被编译?

更新

我刚刚注意到,我指定的语法是左递归的,因此递归下降解析器在处理输入时可能不会停止。这是否造成编制问题的原因呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-07 09:08:37

修正您的变体类型:

代码语言:javascript
复制
typedef boost::variant<
            std::string,
            boost::recursive_wrapper<boost::tuple<ParsedThunk, ParsedThunk> >
        > ParsedThunkEntity;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13751752

复制
相关文章

相似问题

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