Феникс-функция семантического действия не компилируется - PullRequest
1 голос
/ 05 ноября 2011

Я хочу разобрать строку и убедиться, что она в нижнем регистре.

Это должно быть сделано на этом этапе, потому что дух строит дерево из всего этого.

поэтому у меня есть это правило

struct to_lower_object
{
    typedef char result_type;

    char operator()(char a) const
    {   
        return std::tolower(a);    
    }   
};


int main()
{

boost::phoenix::function<to_lower_object> lazy_lower;

qi::rule<std::string::iterator, char() >
    lower_char=(qi::char_-":")
    [
         qi::_val=lazy_lower(qi::_1);
    ];

qi::rule<std::string::iterator, std::string() >
    lower_string =
        +lower_char; 
:::

проблема в том, что он не компилируется, ошибка также огромна, слишком большая для публикации.

Спасибо

РЕДАКТИРОВАТЬ: я исправил перегрузку оператора, это было мое плохо, но проблема остается. Я верю * это связано с заполнителями

РЕДАКТИРОВАТЬ 2: Я разделил проблему, чтобы убедиться, что он работает на символе, а не на серии из них, но он по-прежнему не работает с теми же группами ошибок.

Ответы [ 2 ]

1 голос
/ 06 ноября 2011

Ну после долгих мучений я наконец заработал.

Это:

struct to_lower_object
{
    typedef char result_type;

    char operator()(char a) const
    {   
        return std::tolower(a);    
    }   
};

Должно быть:

struct to_lower_object
{
    template<typename Arg>
    struct result{
        typedef char type;
    };  

    template<typename Arg>
    char operator()(Arg arg1) const
    {   
        return std::tolower(a);    
    }   
};

СуперПо-видимому, это потому, что я читал старые документы.

0 голосов
/ 06 ноября 2011

Я уверен, что строка qi::rule<std::string::iterator, std::string() > никогда не скомпилируется. Вы имели в виду qi::rule<std::string::iterator, std::string >?

...