2012-05-13 5 views
6

Ok, zunächst einmal bin ich kein C++ - Entwickler von Natur aus; Ich habe es geschafft, ein paar Sachen zusammen zu stellen, und es funktioniert gut, aber ich bin sicher, durch die Augen eines Experten sieht es wie Müll =)Boost Eigenschaft Baum Problem bei der Konvertierung in Unicode

Also habe ich eine Freeware-App, die ich gemacht habe, die Property Tree verwendet aus den Boost-Bibliotheken. Ich entwickelte die gesamte App (in VS2010) mit der Einstellung Multi-Byte-Zeichensatz Einstellung. Ich entschied, dass es an der Zeit war, die App zu aktualisieren, um Unicode zu unterstützen, da es einige Leute mit komplexen Zeichensätzen gibt, die ich besser unterstützen möchte.

Ich ging durch den langwierigen Prozess der Änderung aller Referenzen und fordert, breite Strings, alle notwendigen Konvertierungen zu verwenden. Allerdings bin ich an einem Punkt völlig ratlos, die einzigen beiden Compilerfehler, die ich noch habe.

Sie kommen beide aus stream_translator.hpp (/ boost/property_tree /), Zeilen 33 und 36 (wie unten angegeben):

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; 
     } 
    } 
}; 

der Fehler an der Leitung 33 ist:

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 

..und der Fehler an der Leitung 36 ist:

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 

Von dem, was ich in der Lage gewesen, nach hinten durch zu gehen, ist es aus stream_translator.hpp kommenden schließlich als Aufruf beginnen einen Wert zu erhalten [z ptree.get („some.path“, „Standardwert hier“)]

Ich habe wirklich keine Ahnung, wie dieses Problem zu lösen und kann nicht scheinen etwas online mir helfen zu verstehen, was genau das Problem ist, . Irgendwelche Tipps oder Informationen würden sehr geschätzt werden.

EDIT

So kommentierte ich heraus, alles in Bezug auf ptree bis es würde kompilieren, dann sie begann Zugabe wieder in. Es stellt sich heraus, ich kann .get fein nennen, ist es get_child, wo die Fehler @ Linie 36 Pops up (habe das andere Projekt noch nicht gemacht, wo das wstring Problem ist).

Dinge zu vereinfachen, hier ist die effektive Reihenfolge der Anrufe, die in Ordnung sind, bis get_child genannt wird:

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

"Sie kommen beide aus stream_translator.hpp" Nein, sie kommen aus * Ihr Code * gibt 'wstring' an Boost-Code weiter. VS2010 zeigt eine Liste der Template-Instanziierungen an. Folge ihm bis du zu * deinem * Code kommst und poste das. –

+0

Um klar zu sein, ich wollte nie den Boost-Code beschuldigen, ich wusste, dass es irgendwo mein Code war. Ich war faul und hoffte, dass jemand eine einfache Antwort hatte. Ich habe die Arbeit gemacht, um den genauen Punkt des Scheiterns zu finden (für eines der Probleme) und habe die Updates oben gemacht. Beachten Sie, dass der obige Code ohne Fehler bei der Verwendung von Multi-Byte funktioniert, nur fehlschlägt, wenn einmal auf Unicode umgeschaltet wird. – CapersL

Antwort

6

Erraten, dass Ihr Problem das gleiche war ich lief in ... Es breite Charakter Versionen von Boost.PropertyTree für Unicode-Unterstützung.

Für Config.xml, die Setup ist wie folgt aus:

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

Benutzen Sie den Code ähnlich wie diese, es zu analysieren:

// 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

Danke! Ich werde es beim nächsten Mal, wenn ich an dem Code arbeite, durchdrehen. – CapersL

Verwandte Themen