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:問題を分割して、一連の文字ではなく文字で機能していることを確認しましたが、同じ範囲のエラーでは機能していません。

4

2 に答える 2

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);    
    }   
};

素晴らしい。これはどうやら私がいくつかの古いドキュメントを読んでいたためです。

于 2011-11-06T13:23:27.427 に答える
-1

私はその行qi::rule<std::string::iterator, std::string() >が決してコンパイルされないことをかなり確信しています。意味qi::rule<std::string::iterator, std::string >ですか?

于 2011-11-06T00:48:50.743 に答える