2012-05-13 19 views
6

में कनवर्ट करते समय संपत्ति पेड़ की समस्या को बढ़ावा दें ठीक है, पहले मैं प्रकृति द्वारा सी ++ डेवलपर नहीं हूं; मैंने कुछ सामान एक साथ रखने में कामयाब रहा है और यह ठीक काम करता है, लेकिन मुझे यकीन है कि एक विशेषज्ञ की आंखों के माध्यम से यह कचरा जैसा दिखता है =)यूनिकोड

तो मेरे पास एक फ्रीवेयर ऐप है जिसे मैंने संपत्ति वृक्ष का उपयोग किया है बूस्ट पुस्तकालयों से। मैंने पूरे ऐप (वीएस -2010 में) मल्टी-बाइट कैरेक्टर सेट सेटिंग के साथ विकसित किया। मैंने फैसला किया कि यह यूनिकोड का समर्थन करने के लिए ऐप को अपडेट करने और अपडेट करने का समय था क्योंकि जटिल चरित्र सेट वाले कुछ लोग हैं जिन्हें मैं बेहतर समर्थन देना चाहता हूं।

मैं सभी संदर्भों को बदलने की सभी प्रक्रियाओं और व्यापक तारों, सभी आवश्यक रूपांतरणों का उपयोग करने की कड़ी प्रक्रिया के माध्यम से चला गया। हालांकि, मैं पूरी तरह से एक बिंदु पर फंस गया हूं, केवल दो संकलक त्रुटियों को छोड़ दिया है।

वे दोनों stream_translator.hpp से आते हैं (/ बढ़ावा/property_tree /), लाइनों 33 और 36 (नीचे नोट):

template <typename Ch, typename Traits, typename E, typename Enabler = void> 
struct customize_stream 
{ 
    static void insert(std::basic_ostream<Ch, Traits>& s, const E& e) { 
     s << e; //line 33 
    } 
    static void extract(std::basic_istream<Ch, Traits>& s, E& e) { 
     s >> e; //line 36 
     if(!s.eof()) { 
      s >> std::ws; 
     } 
    } 
}; 

त्रुटि लाइन 33 पर है:

Error 347 error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const std::wstring' (or there is no acceptable conversion) {...}\boost_1_49_0\boost\property_tree\stream_translator.hpp 33 1 

..और लाइन 36 पर त्रुटि है:

Error 233 error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::basic_istream<_Elem,_Traits>' (or there is no acceptable conversion) {...}\boost_1_49_0\boost\property_tree\stream_translator.hpp 36 1 

मैं क्या माध्यम से, यह stream_translator.hpp भीतर से आ रहा है पीछे की ओर चलने में सक्षम किया गया है से अंततः एक फोन के रूप में शुरुआत एक मूल्य प्राप्त करने के लिए [उदा ptree.get ("some.path", "यहाँ डिफ़ॉल्ट मूल्य")]

मैं वास्तव में पूरी तरह से पता नहीं कैसे इस समस्या को हल करने के लिए है और मुझे समझने वास्तव में समस्या यह है कि क्या मदद करने के लिए कुछ भी ऑनलाइन खोजने के लिए नहीं कर पा रहे । किसी भी सुझाव या जानकारी की सराहना की जाएगी।

संपादित

तो मैं ptree जब तक यह संकलन होगा संबंधित सब कुछ बाहर टिप्पणी की, तो उन्हें वापस जोड़ने शुरू कर दिया। यह पता चला मैं .Get ठीक कॉल कर सकते हैं, यह get_child है जहां त्रुटि @ लाइन 36 पॉप्स अप (अभी तक अन्य परियोजना नहीं की है, जहां wstring मुद्दा है)।

चीजों को आसान बनाने के लिए, यहाँ कॉल है, जो ठीक हैं के प्रभावी अनुक्रम है जब तक get_child कहा जाता है:

boost::property_tree::ptree pt; 
boost::property_tree::read_xml("Config.xml", pt); 
int iAppSetting = pt.get("config.settings.AppSetting",1); //<- works fine 
ptree ptt; 
ptt = pt.get_child("config.Applications"); //<- adding this line causes the line 36 error 
+0

"वे दोनों stream_translator.hpp से आते हैं" नहीं, वे से आते हैं:

<?xml version="1.0"?> <Zoo> <Monkey> <Food>Bananas</Food> </Monkey> </Zoo> 

उपयोग यह पार्स करने के लिए इस के समान कोड:

config.xml के लिए इस तरह सेटअप है कि * आपका कोड * कोड को बढ़ावा देने के लिए 'wstring' गुजर रहा है। वीएस -2010 टेम्पलेट इंस्टॉलेशन की एक सूची दिखाएगा। इसे तब तक पालन करें जब तक आप * अपना * कोड प्राप्त न करें और उसे पोस्ट न करें। –

+0

स्पष्ट होने के लिए, मैंने बूस्ट कोड को दोष देने का इरादा कभी नहीं किया, मुझे पता था कि यह कहीं मेरा कोड था। मैं आलसी था और उम्मीद करता था कि किसी के पास आसान जवाब होगा। मैंने विफलता के सटीक बिंदु (मुद्दों में से एक के लिए) खोजने के लिए काम किया है और ऊपर दिए गए अपडेट किए हैं। ध्यान दें कि उपरोक्त कोड मल्टी-बाइट का उपयोग करते समय त्रुटि के बिना काम करता है, केवल यूनिकोड पर स्विच करने में विफल रहता है। – CapersL

उत्तर

6

अनुमान है कि आपकी समस्या एक ही मैं भाग गया था में ... विस्तृत चरित्र संस्करण हैं यूनिकोड समर्थन के लिए Boost.PropertyTree का।

// Load up the property tree for wide characters 
boost::property_tree::wptree pt; 
boost::property_tree::read_xml("Config.xml", pt); 

// Iterate 
BOOST_FOREACH(wptree::value_type const& v, pt.get_child(L"Zoo")) 
{ 
    if(v.first == L"Monkey") 
    { 
     wstring foodType = v.second.get<wstring>(L"Food"); 
    } 
} 
+0

धन्यवाद! अगली बार जब मैं कोड पर काम करता हूं तो मैं उसे एक स्पिन दूंगा। – CapersL