Boost Phoenix больше не может назначать переменную qi :: _ 1 после переноса Boost 1.56 в 1.71. - PullRequest
0 голосов
/ 20 января 2020

У меня есть некоторый код C ++, который использует Boost Qi и Phoenix для анализа параметров командной строки. Следующий код прекрасно работал с Boost 1.56.

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
using boost::spirit::repository::distinct;

int type;
unsigned pause, siteID;
bool testMode, log;
std::string filePath;

auto fileName = qi::lexeme[+qi::char_("0-9a-zA-Z_/.:")];
auto grammar = boost::proto::deep_copy(
    distinct(qi::alpha)["/pause="][phx::ref(type) = 0] >> qi::uint_[phx::ref(pause) = qi::_1] |
    distinct(qi::alpha)["/id="][phx::ref(type) = 1] >> qi::uint_[phx::ref(siteID) = qi::_1] |
    distinct(qi::alpha)["/testmode="][phx::ref(type) = 2] >> qi::uint_[phx::ref(testMode) = (qi::_1 != FALSE)] |
    distinct(qi::alpha)["/log="][phx::ref(type) = 3] >> qi::uint_[phx::ref(log) = (qi::_1 != FALSE)] |
    distinct(qi::alpha)["/ini="][phx::ref(type) = 4] >> fileName[phx::ref(filePath) = qi::_1]
);

Недавно я перешел на Boost 1.71, но теперь я получаю следующие ошибки времени компиляции, все из boost.1.71.0.0 \ lib \ native \ include \ boost \ proto \ transform \ default.hpp, строка 154:

Error C2955 'boost::type': use of class template requires template argument list
Error C2955 'boost::mpl::if_c': use of class template requires template argument list
Error C2679 binary '=': no operator found which takes a right-hand operand of type 'T' (or there is no acceptable conversion)
Error C2672 'boost::proto::detail::check_reference': no matching overloaded function
Error C2238 unexpected token(s) preceding ';'
Error C2062 type 'unknown-type' unexpected
Error C2039 'type': is not a member of 'boost::proto::detail::default_assign<Grammar>::impl<Expr     &,State,Data>::nested_and_hidden_nested_result_type'
Error C2039 'type': is not a member of 'boost::proto::detail::default_assign<Grammar>::impl<Expr &,State,Data>::nested_result_type'

Я решил проблему с кодом fileName [phx :: ref (filePath) = qi :: _ 1] . phx :: ref больше не может присваивать значение qi :: _ 1, когда _1 является результатом подвыражения.

qi::uint_[phx::ref(pause) = qi::_1] \\ This is fine
fileName[phx::ref(filePath) = "test"] \\ This is fine
fileName[phx::ref(filePath) = qi::_1] \\ Compile error

Как это исправить? Спасибо

...