2016-08-07 7 views
4

私はに2つの整数のシーケンスを一致させるためにBoost.Sprit x3を使用しようとしています。文書から判断すると、次のコードはコンパイルする必要があり:2つの整数のシーケンスを `std :: pairにマッチングする<int, int> '


#include <string> 
#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 

int main() 
{ 
    using namespace boost::spirit::x3; 

    std::string input("1 2"); 
    std::pair<int, int> result; 
    parse(input.begin(), input.end(), int_ >> int_, result); 
} 

melpon.org link


しかし、それだけで最初の整数と一致します。 std::pair<int, int> result;int result;に変更してからresultを印刷すると、1が出力されます。

どうしてですか? int_ >> int_は、(および属性として設定)に一致するパーサーを定義する正しい方法ではありません 2つの整数?

+5

'std :: pair'に適合する関連するBoost.Fusionヘッダーを含める必要があるようです。 –

+0

@ T.C .:はい、それが問題を解決しました。ありがとう!あなたのコメントを回答として投稿し、私はそれを受け入れます。 –

答えて

5

実際には、@ T.C。 <boost/fusion/adapted/std_pair.hpp>を含めるというコメントは、コンパイラを静かにするだけで、文字列を正しく解析することはできません。私も名前空間のエイリアスであなたのusing namespace boost::spirit::x3を置き換え

#include <iostream> 
#include <string> 
#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 
#include <boost/fusion/adapted/std_pair.hpp> 

int main() 
{ 
    namespace x3 = boost::spirit::x3; 

    std::string input("1 2"); 
    std::pair<int, int> result; 
    auto ok = x3::phrase_parse(input.begin(), input.end(), x3::int_ >> x3::int_, x3::space, result); 
    std::cout << std::boolalpha << ok << ": "; 
    std::cout << result.first << ", " << result.second; 
} 

Live Example

注:私はまた、空白をスキップしx3::phrase_parse()ためx3::parse()を変更する必要がありました。これは読みやすさを維持しますが、膨大な量のBoost.Spiritシンボルをコードにダンプしないようにします。

関連する問題