У меня есть некоторый код 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
Как это исправить? Спасибо