2011-08-05 12 views
7

मैं कुछ पाठ को structs में पार्स करने के लिए बूस्ट :: आत्मा का उपयोग कर रहा हूं। इसके लिए पाठ को पार्स करने और सीधे संरचना में संग्रहीत करने के लिए BOOST_FUSION_ADAPT_STRUCT का उपयोग करने की आवश्यकता है। मुझे पता है कि मैक्रो 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

धन्यवाद! मैंने बस std :: pair <..> टाइप किया है और यह काम किया है :) – Nik

+0

@Nik: यह मैक्रोज़ के साथ एक आम समस्या है - आम तौर पर 'मानचित्र' पर 'BOOST_FOREACH' के साथ आता है जो फ़्यूज़न/आत्मा संयोजन से थोड़ा अधिक आम है :) आशा है कि आप उन लोगों के साथ मजाक कर रहे हैं! –

संबंधित मुद्दे