# include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; namespace phoenix = boost::phoenix; using boost::spirit::ascii::space; using phoenix::at_c; using namespace qi::labels; typedef std::string::const_iterator Iter; struct Data { char val1; char val2; }; BOOST_FUSION_ADAPT_STRUCT(Data,(char, val1)(char, val2)); struct TestGrammar : qi::grammar(), ascii::space_type> { qi::rule(), ascii::space_type> list; qi::rule value; TestGrammar() : TestGrammar::base_type(list) { value = qi::char_[ at_c<0>(_val) = _1 ] >> qi::char_[ at_c<1>(_val) = _1 ]; list = (qi::int_ >> value)[ _val[_1] = _2 ]; } }; int main( ) { std::string input = "2 c d"; Iter iter = input.begin(), end = input.end(); TestGrammar grammar; std::map map; bool ans = phrase_parse( iter, end, grammar, space, map ); assert( ans ); assert( iter == end ); BOOST_AUTO( it, map.find(2) ); assert( it != map.end() ); assert( it->second.val1 == 'c' ); // FAILS! assert( it->second.val2 == 'd' ); // FAILS! }