2011-11-05 82 views
1

鳳凰功能語義動作我想解析字符串,並確保它是小寫。沒有編制

它,因爲精神構建樹出來的這一切將在這個階段完成。

,所以我有這個規則

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; 
::: 

問題是,它無法編譯,錯誤的是巨大的也是,往大了發佈。

感謝

編輯:我定的操作符重載,那是我不好,但問題仍然存在。我相信*這是與佔位符

EDIT2:我已經分解了這個問題,以確保它在一個字符而不是一系列的工作,但它仍然不工作與錯誤。

+0

您正在使用鳳凰V2或V3? – ildjarn

+0

鳳凰第3版提升1.47 – 111111

回答

1

那麼多折磨後,我終於得到它的工作。

此:

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

如果您使用Phoenix v2,此更改纔有意義。也就是說,如果你真的使用Phoenix v3,你的'之前'代碼已經很理想了。 – ildjarn

-1

我敢肯定,該行qi::rule<std::string::iterator, std::string() >永遠不會編譯。你的意思是qi::rule<std::string::iterator, std::string >

+0

沒有那就是它是如何實現的精神,出於某種原因,用了語義動作,它可以編譯和運行與的std :: string(預期),並且不無。所有那裏doc顯示他們通過OutputType() – 111111