The simplest fix is to supply the value i
picked up from the first qi::int_ to the second one, i.e.:
qi::int_[phx::ref(i) = qi::_1] >> qi::lit(",") >> qi::int_(phx::ref(i)) >> qi::lit(",") >> +qi::char_,
qi::_int with a parameter expects the supplied value.
Another alternative to consider is the use of a rule-local variable. You could do this:
typedef boost::fusion::vector<int,int,std::string> result_t;
result_t result;
qi::rule<std::string::const_iterator, result_t(),
boost::spirit::qi::locals<int> > r;
r %= qi::int_[qi::_a = qi::_1] >> qi::lit(",") >> qi::int_(qi::_a) >> qi::lit(",") >> +qi::char_;
Then use "r" in place of your rule. Although I suppose if you just intend to run the rule directly using qi::parse this doesn't make sense.