Невозможно преобразовать структуру Boost :: Fusion в Boost :: вариант при использовании Boost :: Spirit

Доброе время суток!

Я написал этот кусок кода и ожидаю, что он будет скомпилирован.

#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, я получаю сообщение об ошибке. Самая интересная часть этого:

/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 и Boost 1.52, но я думаю, что это не имеет значения. 🙂

Как мне отредактировать этот кусок кода, чтобы он был скомпилирован?

ОБНОВИТЬ

Ну, я только что заметил, что указанная грамматика является леворекурсивной, и, следовательно, рекурсивный анализатор спуска может не останавливаться при обработке ввода. Может ли это быть причиной проблемы компиляции?

2

Решение

Исправьте тип вашего варианта:

typedef boost::variant<
std::string,
boost::recursive_wrapper<boost::tuple<ParsedThunk, ParsedThunk> >
> ParsedThunkEntity;
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector