2011-08-05 43 views
7

我使用Boost :: Spirit將一些文本解析爲結構。這需要使用BOOST_FUSION_ADAPT_STRUCT解析文本並直接存儲到結構中。我知道這個宏有兩個參數:第一個參數的結構名稱和第二個參數的所有結構成員。我正在通過那些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

謝謝!我只是鍵入了std :: pair <..>,它的工作原理:) – Nik

+0

@Nik:這是宏的一個常見問題 - 通常會在'map'上面提供'BOOST_FOREACH',它比Fusion/Spirit組合稍微普遍:)希望你玩得開心! –