При использовании qi::locals
локальный параметр не выглядит так, как его можно использовать в качестве семантического предиката для eps
. Вот урезанная вымышленный пример:Почему я не могу использовать qi locals в качестве семантического предиката для eps?
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
using namespace qi::labels;
using qi::eps;
template <typename Iterator, typename Any>
struct parser : qi::grammar<Iterator, Any(), qi::locals<bool> > {
parser() : parser::base_type(p) {
p = eps[_a=false] >> eps(_a);
}
qi::rule<Iterator, Any(), qi::locals<bool> > p;
};
int main(int argc, const char *argv[]) {
int val;
std::string data;
auto i = data.cbegin();
auto end = data.cend();
parser<decltype(i), decltype(val) > p;
bool rv = phrase_parse(i, end, p, ascii::blank, val);
return rv ? 0 : 1;
}
В этом примере, если я удалить (_a)
после второго eps
, все компилируется. С (_a)
я получаю болото неудачной копии экземпляра. Контекст не имеет значения, поскольку я решил эту проблему в моей реальной кодовой базе по-другому, но я хотел бы знать, почему это не работает.
Почему вы не указать, какую версию компилятора/подталкивания вы используете. +1 для превосходного минимального автономного образца, хотя – sehe
g ++ 4.9.2, boost 1.55 – md5i