2014-02-22 1 views
1
#include <iostream> 
#include <vector> 
#include <string> 
#include <boost/spirit/include/qi.hpp> 

namespace qi = boost::spirit::qi; 

int main() 
{ 
    std::string input("aa aa aa"); 
    std::string::iterator strbegin = input.begin(); 

    qi::rule<std::string::iterator, std::vector<std::string>(), qi::ascii::space_type > testRule = 
     +(qi::string("aa")); 

    std::vector<std::string> result; 
    bool ok = qi::phrase_parse(strbegin, input.end(), 
      testRule, 
      qi::space,     
      result);        

    if (ok && strbegin == input.end()) { 
     std::cout << result.size(); 
     for (int i = 0; i < result.size(); ++i) { 
      std::cout << result[i] << " "; 
     } 
    } else { 
     std::cout << "fail" << std::endl; 
     std::cout << std::string(strbegin, input.end()) << std::endl; 
    } 
} 

이 코드에서 문제를 찾아내려면 도움이 필요합니다. 오류 메시지는 다음과 같습니다 qi::space부스트 코드. 컴파일러 오류

In file included from /usr/local/include/boost/spirit/home/qi/nonterminal.hpp:14:0, 
       from /usr/local/include/boost/spirit/home/qi.hpp:20, 
       from /usr/local/include/boost/spirit/include/qi.hpp:16, 
       from main.cpp:4: 
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp: In member function ‘bool boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Context = boost::spirit::context<boost::fusion::cons<std::vector<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::standard> >, Attribute = std::vector<std::basic_string<char> >, Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, T1 = std::vector<std::basic_string<char> >(), T2 = 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>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type]’: 
/usr/local/include/boost/spirit/home/qi/reference.hpp:43:71: instantiated from ‘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::vector<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::standard> >, Attribute = std::vector<std::basic_string<char> >, Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, std::vector<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> >]’ 
/usr/local/include/boost/spirit/home/qi/parse.hpp:164:9: instantiated from ‘bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, boost::spirit::qi::skip_flag::enum_type, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Expr = boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, std::vector<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> >, Skipper = 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::standard> >, 0l>, Attr = std::vector<std::basic_string<char> >]’ 
/usr/local/include/boost/spirit/home/qi/parse.hpp:197:86: instantiated from ‘bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Expr = boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, std::vector<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> >, Skipper = 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::standard> >, 0l>, Attr = std::vector<std::basic_string<char> >]’ 
main.cpp:20:19: instantiated from here 
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:303:17: error: no match for call to ‘(const function_type {aka const boost::function<bool(__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, boost::spirit::context<boost::fusion::cons<std::vector<std::basic_string<char> >&, boost::fusion::nil>, boost::fusion::vector0<> >&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >&)>}) (__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, std::vector<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> >::context_type&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&)’ 
/usr/local/include/boost/function/function_template.hpp:1048:7: note: candidate is: 
/usr/local/include/boost/function/function_template.hpp:761:17: note: boost::function4<R, T1, T2, T3, T4>::result_type boost::function4<R, T1, T2, T3, T4>::operator()(T0, T1, T2, T3) const [with R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<std::vector<std::basic_string<char> >&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >&, boost::function4<R, T1, T2, T3, T4>::result_type = bool] 
/usr/local/include/boost/function/function_template.hpp:761:17: note: no known conversion for argument 4 from ‘const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >’ to ‘const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >&’ 
make: *** [all] Error 1 

답변

3

유형 qi::space_type입니다. 따라서 ascii을 삭제하거나 둘 다 삭제하십시오.