错误包括boost / spirit / include / qi.hpp(Error including boost/spirit/include/qi.hpp)

编程入门 行业动态 更新时间:2024-10-26 16:34:35
错误包括boost / spirit / include / qi.hpp(Error including boost/spirit/include/qi.hpp)

我遇到了与此处相同的错误。 请参阅底部的“编译信息”以获取长错误消息。 基本上如果我#include <boost / spirit / include / qi.hpp>我无法编译。 完全被这一个难倒......我正在使用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; }

I'm having the same error as occurs here. See 'compilation info' at the bottom for the long error message. Basically if I #include <boost/spirit/include/qi.hpp> I can't compile. Totally stumped by this one... I am compiling with g++ 4.9.3 on Debian using C++11. For reference the first part of the error message is:

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 code is actually a little bit different to the above example:

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

最满意答案

你的字符串不是const,所以迭代器的first和last不是const迭代器。

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

my_grammar<Iterator> g;

住在科利鲁

#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"; } } }

Your string isn't const, so the iterators first and last aren't const iterators.

Either make the my_Parse function not a template (after all, you hardcode the iterator type on the grammar to be std::string::const_iterator anyways), or instantiate the grammar with the actual iterator type:

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

更多推荐

本文发布于:2023-08-07 16:27:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1465504.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:错误   spirit   boost   include   including

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!