
FWIW, your issue can be reproduced with much shorted code:
<skip include> <skip Ipv4 definition>
namespace qi = boost::spirit::qi; qi::uint_parser<uint8_t, 10, 1, 3> octet; int main() { Ipv4 ip; std::string s = "1.2.3.4"; bool r = qi::parse(s.begin(), s.end(), octet >> '.' >> octet >> '.' >> octet >> '.' >> octet, ip); }
or even simpler: boost::tuple<uint8_t, uint8_t, uint8_t, uint8_t> v; bool r = qi::parse(s.begin(), s.end(), octet >> '.' >> octet >> '.'
octet >> '.' >> octet, v);
while the following works correctly: boost::fusion::vector<uint8_t, uint8_t, uint8_t, uint8_t> v; bool r = qi::parse(s.begin(), s.end(), octet >> '.' >> octet >> '.'
octet >> '.' >> octet, v);
So, the attribute gets converted to boost::tuple is some strange way...