2011-08-05 11 views
7

私はBoost :: Spiritを使ってテキストを構造体に解析しています。これには、テキストを解析して構造体に直接格納するためにBOOST_FUSION_ADAPT_STRUCTを使用する必要があります。私はマクロが2つの引数を取ることを知っています:第1引数としての構造体名と第2引数としてのすべての構造体メンバそして、私はちょうどそれらの2を渡しています。しかし、私は言ってコンパイルエラーを取得し、ここでBOOST_FUSION_ADAPT_STRUCTは正しい数の引数を取っていません

error: macro "BOOST_FUSION_ADAPT_STRUCT_FILLER_0" passed 3 arguments, but takes just 2 

は、コードスニペットです。コード全体が必要な場合はお知らせください。

ありがとうございました。

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

    struct Dir_Entry_Pair 
    { 
     std::string     dir; 
     std::string     value1; 
     std::pair<std::string, std::string> keyw_value2; 
    }; 
} 

BOOST_FUSION_ADAPT_STRUCT(
    client::Dir_Entry_Pair, 
    (std::string, dir) 
    (std::string, value1) 
    (std::pair< std::string, std::string >, keyw_value2)) 

これは

qi::rule<Iterator, Dir_Entry_Pair()> ppair = dir 
               >> '/' 
               >> entry 
               >> -(keyword >> entry); 

答えて

10

ほとんどの問題はstd::pair<std::string,std::string>で、私が解析しようとしているルールです。

問題は、タイプにカンマがあり、マクロ展開で混乱を招くことです(リストの最後の要素を使用する場合)。

型を独自の括弧で囲むようにしてください。

+1

ありがとうございます!私はちょうどtypedef'd std :: pair <..>そしてそれは働いた:) – Nik

+0

@ニック:これは、マクロでよく見られる問題です - 通常はマップ上に 'BOOST_FOREACH'があります。これはFusion/Spiritの組み合わせよりやや一般的です:)あなたはそれらを楽しんでいることを望んでいる! –

関連する問題