【问题标题】:Error including boost/spirit/include/qi.hpp错误包括 boost/spirit/include/qi.hpp
【发布时间】:2015-09-21 00:20:47
【问题描述】:

我遇到了与here 相同的错误。有关长错误消息,请参阅底部的“编译信息”。基本上,如果我 #include 我无法编译。完全被这个难住了......我正在使用 C++11 在 Debian 上使用 g++ 4.9.3 进行编译。错误消息的第一部分供参考:

In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
             from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
             from /usr/include/boost/spirit/home/qi.hpp:20,
             from /usr/include/boost/spirit/include/qi.hpp:16,
             from prog.cpp:9:
/usr/include/boost/spirit/home/qi/reference.hpp: In instantiation of 'bool boost::spirit::qi::reference<Subject>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Context = boost::spirit::context<boost::fusion::cons<std::basic_string<char>&, boost::fusion::nil_>, boost::spirit::locals<> >; Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >; Attribute = std::basic_string<char>; Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>]':

我的代码实际上和上面的例子有点不同:

My::Dictionary Parser::parse( const char * s ) {
  std::string input(s);     // input to parse
  qi_my_protocol grammar;   // create instance of parser
  My::Dictionary msg;      // map to receive results
  bool result = qi::phrase_parse(
    input.begin(),
    input.end(),
    grammar,
    qi::space,
    msg
  ); // returns true if successful
  return msg;
}

【问题讨论】:

  • 请给出一个正确的问题标题(包括标题没有任何问题,您可以轻松检查)。包含相关代码。
  • 第 9 行的 prog.cpp 中的#include 很明显失败了。
  • 当然不是。评论phrase_parse 电话。或者,也许,阅读我的答案。
  • 好的,我明白你的意思了。谢谢你帮助我。我的代码实际上与我在 ideone 上找到的示例有点不同。如果我注释掉 phrase_parse 调用它会编译,但我不知道如何修复对 phrase_parse 的调用
  • 你怎么能不呢?你……没看到我的回答吗?它是 52 分钟前的。附带一个在 coliru 上运行的工作示例...

标签: c++11 boost g++ boost-spirit


【解决方案1】:

您的字符串不是 const,所以迭代器 firstlast 不是 const 迭代器。

要么使my_Parse 函数不是模板(毕竟,您将语法上的迭代器类型硬编码为std::string::const_iterator),或者用实际的迭代器类型实例化语法:

my_grammar<Iterator> g;

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

#include <stdio.h>

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

template <typename Iterator>
struct my_grammar : boost::spirit::qi::grammar<Iterator, std::string(), ascii::space_type>
{

    my_grammar() : my_grammar::base_type(start)
    {
        using qi::alpha;
        using qi::alnum;

        start %=
            (+alpha | +alnum)
            ;
    }

    qi::rule<Iterator, std::string(), ascii::space_type> start;
};

template <typename Iterator>
bool my_Parse(Iterator first, Iterator last, std::string& result)
{
    using boost::spirit::ascii::space;

    my_grammar<Iterator> g;

    bool r = phrase_parse(first, last, g, space, result);

    if (!r || first != last) // fail if we did not get a full match
        return false;

    return r;
}



int main() {
    std::string str;
    while (getline(std::cin, str))
    {
        std::string result = "";
        if (my_Parse(str.begin(), str.end(), result))
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing succeeded\n";
            std::cout << "got: " << result << std::endl;
            std::cout << "\n-------------------------\n";
        }
        else
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing failed\n";
            std::cout << "-------------------------\n";
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多