Прежде всего, подпись pairSequence
должна быть:
qi::rule<Iterator, std::vector<Pair>()> pairSequence;
как оператор списка выставляет std::vector<Pair>
в качестве своего атрибута.
Все функции, вызываемые из семантического действия, должны быть «ленивыми», поэтому вам нужно использовать Phoenix:
namespace phx = boost::phoenix;
pairSequence =
double_[
phx::push_back(_val,
phx::construct<Pair>(_1, phx::val(DEFAULT_B))
)
] % separator
;
Другой возможностью было бы добавить (неявный) конструктор к Pair
:
struct Pair
{
Pair(double a) : a(a), b(DEFAULT_B) {}
double a;
double b;
};
, который позволяет упростить грамматику:
pairSequence = double_ % separator;
и полностью полагается на встроенные в Spirit правила распространения атрибутов.
Кстати, чтобы все это работало, вам не нужно адаптировать Pair
как последовательность Fusion.