2015-04-10 3 views
1

При использовании 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) я получаю болото неудачной копии экземпляра. Контекст не имеет значения, поскольку я решил эту проблему в моей реальной кодовой базе по-другому, но я хотел бы знать, почему это не работает.

+0

Почему вы не указать, какую версию компилятора/подталкивания вы используете. +1 для превосходного минимального автономного образца, хотя – sehe

+0

g ++ 4.9.2, boost 1.55 – md5i

ответ

1

На моих компиляторах/версии наддува работает См также Live On Coliru

На прихоти я подозревающая ошибки, которые вкрались в «старую» реализацию Phoenix V2. Phoenix V2 по-прежнему был частью библиотеки Spirit. Он был заменен Phoenix V3, который живет как отдельная библиотека в boost/phoenx/....

Boost Phoenix V2 показывает трещины возраста - в основном, на современных компиляторах, где утилиты BOOST_RESULT_OF() используют decltype.

Длинная короткая история

  1. попробовать с помощью

    #define BOOST_SPIRIT_USE_PHOENIX_V3 
    

    использовать его тогда и только тогда ваш компилятор/подталкивание комбинация не выбирает it.¹

  2. обратно, если ваш компилятор старый, попробуйте

    #define BOOST_RESULT_OF_USE_TR1 
    

¹ Последние версии Spirit упали Phoenix V2: Farewell Phoenix-v2

+1

Определение BOOST_SPIRIT_USE_PHOENIX_V3 сделало трюк. – md5i

 Смежные вопросы

  • Нет связанных вопросов^_^