Конечно, когда вы используете семантические действия, автоматическое распространение атрибутов не произойдет. Оба ваших синтаксических анализатора (+(char_ - ':')
и *char_
) представляют std::vector<char>
в качестве своего атрибута. Следовательно, _1
относится также к std::vector<char>
. Если cmd
и params
являются экземплярами std::string
, он не будет компилироваться, поскольку не определено присвоение от std::vector<char>
до std::string
.
Однако, если вы избавитесь от семантических действий, это сработает:
std::string s("command:param1 param2");
std::string cmd, params;
parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params);
Это не только проще, но и быстрее. Парсер поместит совпавшие символы прямо в предоставленные строки.