C++ 使用boost::spirit时,无法在boost::variant中转换boost::fusion结构

C++ 使用boost::spirit时,无法在boost::variant中转换boost::fusion结构,c++,boost,boost-spirit,boost-variant,boost-fusion,C++,Boost,Boost Spirit,Boost Variant,Boost Fusion,一天中的好时光 我写了这段代码,希望它能够被编译 #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 Parse

一天中的好时光

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

#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;
}
#包括
#包括
#包括
#包括
#包括
结构解析图
{
typedef boost::variant ParsedThunkEntity;
解析的hunkentity_实体;
};
增强融合适应结构(
ParsedThunk,
(ParsedThunk::ParsedThunkEntity,_实体)
)
类ThunkParser
{
受保护的:
精神:气:规则(rule);
公众:
ThunkParser()
{
_thunkRule%=(
(boost::spirit::qi::lexeme[+(boost::spirit::qi::char_-boost::spirit::qi::char_(“=()”))|
(boost::spirit::qi::lit(“(”)>\u thunkRule>>\u thunkRule>>boost::spirit::qi::lit(“)”)
(\u-thunkRule>>\u-thunkRule)
)>>助力::精神::气::每股收益;
}
};
内部主(空)
{
返回0;
}
但是当我用clang或GCC编译它时,我得到了一个错误。其中最有趣的部分是:

/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)
/usr/include/boost/variant/detail/initializer.hpp:89:24:注意:候选函数不可行:未知从“const boost::fusion::vector2”到“const boost::fusion::vector2”的转换
boost::tuples::tuple'用于第二个参数;
静态int初始化(void*dest,参数操作数)
我使用clang 3.1或gcc 4.7和boost 1.52,但我认为这并不重要。:)

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

更新

我注意到我指定的语法是左递归的,因此递归解析器在处理输入时可能不会停止。这可能是编译问题的原因吗?

修复您的变量类型:

typedef boost::variant<
            std::string,
            boost::recursive_wrapper<boost::tuple<ParsedThunk, ParsedThunk> >
        > ParsedThunkEntity;
typedef boost::variant<
std::字符串,
递归包装器
>帕塞德亨肯特性;

您能解释一下为什么
boost::recursive\u包装器应该工作,而
boost::tuple
不应该工作吗?我想了解。toplevel包装防止类型定义非法(通过“延迟”嵌套类型)。您使用的“叶子”包装器阻止了通常的属性传播,因为
boost::spirit::traits
不专门用于
recursive\u包装器
。所以顶级包装器就足够了,而且更方便了。好的,谢谢你的解释。我将检查此解决方案,并在12小时内将答案标记为已接受。