凤凰函数语义动作不编译

时间:2011-11-05 15:34:25

标签: c++ boost lazy-evaluation boost-spirit boost-phoenix

我希望解析一个字符串并确保它是小写的。

必须在这个阶段完成,因为精神构建了一切树。

所以我有这个规则

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:我已经解决了问题,以确保它正在处理char而不是一系列问题,但它仍然没有使用相同的错误。

2 个答案:

答案 0 :(得分: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);    
    }   
};

超级。这显然是因为我正在阅读一些旧文档。

答案 1 :(得分:-1)

我很确定第qi::rule<std::string::iterator, std::string() >行永远不会编译。您的意思是qi::rule<std::string::iterator, std::string >吗?