C++ 精神语法赢得';t编译:函数模板参数错误?

C++ 精神语法赢得';t编译:函数模板参数错误?,c++,parsing,compiler-errors,boost-spirit,C++,Parsing,Compiler Errors,Boost Spirit,编译这个简单的Spirit语法会导致一个错误(尽管有巨大的错误消息),可能与我的skipper或其他一些我错误使用的模板参数有关 我尝试了语法和开始规则的各种属性定义,但对错误没有影响 #include <string> #include "/usr/local/boost/include/boost/spirit/include/qi.hpp" #include "/usr/local/boost/include/boost/spirit/include/qi_symbols.hp

编译这个简单的Spirit语法会导致一个错误(尽管有巨大的错误消息),可能与我的skipper或其他一些我错误使用的模板参数有关

我尝试了语法和开始规则的各种属性定义,但对错误没有影响

#include <string>
#include "/usr/local/boost/include/boost/spirit/include/qi.hpp"
#include "/usr/local/boost/include/boost/spirit/include/qi_symbols.hpp"

using std::string;

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;

boost::spirit::qi::rule<string::const_iterator>
    skipper_rule = qi::space | '#' >> *(qi::char_ - qi::eol) >> qi::eol;

typedef BOOST_TYPEOF(skipper_rule) skipper_T;

template <typename Iterator, typename Skipper>
    class Grammar1 : boost::spirit::qi::grammar<Iterator, Skipper>
{
    public:

    typedef boost::spirit::qi::rule<Iterator, Skipper>  rule_nil_T;
    typedef boost::spirit::qi::rule<Iterator, string()> rule_str_T;

    rule_nil_T under =  qi::char_('_');
    rule_nil_T dot   =  qi::char_('.');
    rule_nil_T star  =  qi::char_('*');

    rule_str_T file_name_star = qi::lexeme [ (qi::alpha | under) >> *(qi::alnum | under) >> dot >> star ];

    rule_nil_T start = +file_name_star;

    Grammar1(void) : Grammar1::base_type(start)  { };
    ~Grammar1(void) { };

    void parseInputFile(Iterator itr, Iterator itr_end)
    {
        bool b;
        bool r = phrase_parse(itr, itr_end, start, skipper_rule);
        if (r && itr == itr_end)
        {
            std::cout << "Parsing succeeded\n";
        } else
        {
            string rest(itr, itr_end);
            std::cout << "stopped at: \": " << rest << "\"\n";
       }
    }
};


int main(int argc, char **argv)
{
    Grammar1<string::const_iterator, skipper_T> g;
    string input("input1.* input2.*");

    g.parseInputFile(input.cbegin(), input.cend());

 }
上述Spirit文件中第304行的注释指出 可能使用了不兼容的跳过程序,但我尝试了更简单的ascii::space_类型的跳过程序,但没有效果

错误消息的其余部分:

usr/local/boost/include/boost/function/function_template.hpp:1048:7: note: 
candidate is:
 class function<BOOST_FUNCTION_PARTIAL_SPEC>
       ^
/usr/local/boost/include/boost/function/function_template.hpp:758:17: note:
 boost::function4<R, T1, T2, T3, T4>:: *REMOVED*
     result_type operator()(BOOST_FUNCTION_PARMS) const
                 ^
usr/local/boost/include/boost/function/function_模板。hpp:1048:7:注意:
候选人是:
类函数
^
/usr/local/boost/include/boost/function/function_模板。hpp:758:17:注:
boost::function4::*已删除*
结果类型运算符()(BOOST函数参数)常量
^
/usr/local/boost/include/boost/function/function\u模板。hpp:758:17:注意:
参数4从'const'的转换未知
boost::spirit::unused_type'to'const boost::spirit::qi::reference&'

知道我做错了什么吗?我的编译器是GCC4.8.5。

您正在尝试使用
规则为零的
规则,该规则在
规则为空的
规则为空的
规则。由于内部原因,Spirit在调用规则时只能失去skipper。通过在
下内联
,以及在使用现场内联
可以很容易地解决这个问题

注意:Qi中的规则调用有开销。为这样一个简单的解析器创建一个规则,然后在重复解析器中使用它不是一个好主意


提示:您可以利用
raw
指令,并在指令中使用文字解析器,以获得更高的性能和更清晰的解析器外观。考虑这一点:<代码>齐::Leime[Q::RAW [(Q::Alpha′'')> Q::AlnU%'.' ] >“*”] /<代码> < /P>修复它。谢谢
usr/local/boost/include/boost/function/function_template.hpp:1048:7: note: 
candidate is:
 class function<BOOST_FUNCTION_PARTIAL_SPEC>
       ^
/usr/local/boost/include/boost/function/function_template.hpp:758:17: note:
 boost::function4<R, T1, T2, T3, T4>:: *REMOVED*
     result_type operator()(BOOST_FUNCTION_PARMS) const
                 ^
/usr/local/boost/include/boost/function/function_template.hpp:758:17: note:
   no known conversion for argument 4 from ‘const 
boost::spirit::unused_type’ to ‘const boost::spirit::qi::reference<const 
boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*,
 std::basic_string<char> > > >&’