2012-05-13 7 views
6

Bueno, primero no soy desarrollador de C++ por naturaleza; He logrado juntar algunas cosas y funciona bien, pero estoy seguro de que a través de los ojos de un experto parece basura =)Aumenta el problema del árbol de propiedades al convertir a Unicode

Así que tengo una aplicación gratuita que he creado que utiliza Property Tree de las bibliotecas de Boost. Desarrollé toda la aplicación (en VS2010) con la configuración Usar Multi-Byte Character Set. Decidí que era el momento de revisar y actualizar la aplicación para que sea compatible con Unicode, ya que hay algunas personas con conjuntos de caracteres complejos que me gustaría apoyar mejor.

Pasé por el tedioso proceso de cambiar todas las referencias y llamadas para utilizar cadenas anchas, todas las conversiones necesarias. Sin embargo, estoy completamente perplejo en un punto, los únicos dos errores de compilación que me quedan.

Ambos vienen de stream_translator.hpp (/ refuerzo/property_tree /), las líneas 33 y 36 (como se indica a continuación):

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

El error en la línea 33 es:

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 

..y el error en la línea 36 es:

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 

Por lo que he sido capaz de caminar hacia atrás a través, que viene desde dentro stream_translator.hpp en última instancia, comenzando como una llamada para obtener un valor [por ejemplo, ptree.get ("some.path", "valor por defecto")]

Realmente no tengo ni idea de cómo resolver este problema y parece que no puede encontrar nada en línea para ayudar a entender lo que es exactamente el problema . Cualquier consejo o información sería muy apreciado.

EDITAR

Así que comentada todo lo relacionado con ptree hasta que se compilará, a continuación, comenzó a añadir de nuevo en. Resulta que yo puedo llamar .get bien, es get_child donde el error @ línea de 36 contaminantes orgánicos persistentes up (aún no ha hecho el otro proyecto, donde está el problema de wstring).

Para simplificar las cosas, aquí es la secuencia efectiva de las llamadas, que son bien hasta get_child se llama:

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

"Ambos vienen de stream_translator.hpp" No, ellos vienen de * su código * pasando 'wstring's al código Boost. VS2010 mostrará una lista de instancias de plantilla. Síguelo hasta que obtengas * tu * código y publícalo. –

+0

Para ser claro, nunca tuve la intención de culpar al código de Boost, sabía que era mi código en alguna parte. Estaba siendo flojo y esperaba que alguien tuviera una respuesta fácil. Hice el trabajo para encontrar el punto exacto de falla (para uno de los problemas) e hice las actualizaciones arriba. Tenga en cuenta que el código anterior funciona sin errores cuando se usa Multi-Byte, solo falla al cambiar a Unicode. – CapersL

Respuesta

6

adivinando que su problema era el mismo me encontré con ... Hay versiones de caracteres anchos de Boost.PropertyTree para soporte unicode.

Para Config.xml que es configuración como esta:

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

utilizar código similar a esto para analizarlo:

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

Gracias! Voy a dar un giro la próxima vez que trabaje en el código. – CapersL

Cuestiones relacionadas