2011-07-01 9 views
2

私はブーストスピリットを学んでおり、ドキュメントで与えられている例をダブルスの代わりに文字列にマッチさせるだけで修正しました。しかし、コードはコンパイルされず、デバッグできないエラーが発生します。以下はコードと印刷されたエラーです。この問題をデバッグするのを手伝ってもらえますか?ブーストスピリットを使用した文字列の一致

PS:私は、phoenix :: refをベクトル文字列に使用していると推測していますが、その理由と理由は正確にはわかりません。

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix_core.hpp> 
#include <boost/spirit/include/phoenix_operator.hpp> 
#include <boost/spirit/include/phoenix_stl.hpp> 
#include <boost/config/warning_disable.hpp> 

#include <iostream> 
#include <string> 
#include <vector> 

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

    template <typename Iterator> 

    bool parse_data(Iterator first, Iterator last, std::vector<std::string>& v) 
    { 
     using qi::double_; 
     using qi::char_; 
     using qi::phrase_parse; 
     using qi::_1; 
     using ascii::space; 
     using phoenix::ref; 
     using phoenix::push_back; 

     bool r = phrase_parse(
      first, 
      last, 
      +(char_)[push_back(ref(v), _1)],   
      char_('/') 
     ); 
     if (first != last) 
      return false; 
     return r; 
    } 
} 

int 
main() 
{ 
    std::string str; 

    while (getline(std::cin, str)) 
    { 
     if (str.empty()) 
      break; 

     std::vector<std::string> v; 
     if(client::parse_data(str.begin(), str.end(), v)) 
     { 
      std::cout << std::endl << "Parsing done" << std::endl; 
      std::cout << "Numbers are " ; 
      for(std::vector<std::string>::iterator i = v.begin(); i < v.end(); i++) 
      { 
       std::cout << *i <<" "; 
      } 
      std::cout << std::endl; 
     } 
     else 
     { 
      std::cout << "Parsing Failed" << std::endl; 
     } 
    } 

    return 0; 
} 

これは私が取得エラーです:

/usr/local/include/boost_1_46_1/boost/spirit/home/phoenix/stl/container/container.hpp:492: 
error: invalid conversion from ‘const char’ to ‘const char*’ 

/usr/local/include/boost_1_46_1/boost/spirit/home/phoenix/stl/container/container.hpp:492: 
error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ 

答えて

2

あなたは

bool r = phrase_parse(
    first, last, +(char_[push_back(ref(v), _1)]), char_('/') 
); 

としてそれを記述する場合、それは動作します。しかし、書き込み

bool r = phrase_parse(
    first, last, +char_, '/', v 
); 

はさらに簡単です(より速く実行されます)。

+0

ありがとうございます!コードは、2番目のコードブロック用にコンパイルされています。 – Nik

+0

私はもう少し質問があります。 1)2番目のコードブロックは私とどのように異なっていますか? 2)私は単一の文字を+ char_とマッチングするだけです。文字列にどのように一致させるのですか? – Nik