Увеличена проблема с деревом свойств при конвертации в Unicode

Хорошо, во-первых, я не являюсь разработчиком C ++ по своей природе; Мне удалось собрать кое-что вместе, и это отлично работает, но я уверен, что глазами эксперта это выглядит как мусор =)

Итак, у меня есть бесплатное приложение, которое я создал и которое использует Property Tree из библиотек Boost. Я разработал все приложение (в VS2010) с использованиемMulti-Byte Character Set установка. Я решил, что пришло время пройти и обновить приложение для поддержки Unicode, так как есть некоторые люди со сложными наборами символов, которые я бы хотел лучше поддерживать.

Я прошел через утомительный процесс изменения всех ссылок и вызовов, чтобы использовать широкие строки, все необходимые преобразования. Тем не менее, я полностью озадачен одной единственной ошибкой компилятора, которую я оставил.

Они оба родом изstream_translator.hpp (/ boost / property_tree /), строки 33 и 36 (как указано ниже):

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

The error at line 33 is:

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

..and the error at line 36 is:

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

Из того, что я смог пройти назад, оно идет изнутриstream_translator.hpp в конечном счете, начиная с вызова, чтобы получить значение [например, ptree.get (& quot; some.path & quot ;, & quot; значение по умолчанию здесь & quot;)]

Я действительно понятия не имею, как решить эту проблему, и не могу найтиanything онлайн, чтобы помочь мне понять, в чем именно проблема. Любые советы или информация будет принята с благодарностью.

EDIT

Поэтому я закомментировал все, что касается ptree, пока он не скомпилировался, а затем начал добавлять их обратно. Оказывается, я могу вызвать .get нормально, это get_child, где выскакивает ошибка @ line 36 (не сделал другой проект все же, где проблема wstring).

Чтобы упростить ситуацию, вот эффективная последовательность вызовов, которые хороши до вызова get_child:

<code>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
</code>
 Nicol Bolas13 мая 2012 г., 03:35
& quot; Они оба взяты из stream_translator.hpp & quot; Нет, они приходят изyour code прохождениеwstringс, чтобы повысить код. VS2010 покажет список шаблонов. Следуйте ему, пока не доберетесь доyour код и опубликовать это.
 CapersL13 мая 2012 г., 05:08
Чтобы было ясно, я никогда не собирался обвинять код Boost, я знал, что это где-то мой код. Я ленился и надеялся, что у кого-то будет легкий ответ. Я выполнил работу, чтобы найти точную точку сбоя (по одной из проблем), и произвел обновления выше. Обратите внимание, что вышеприведенный код работает без ошибок при использовании многобайтового кода, но только после переключения на Unicode.

Ответы на вопрос(1)

Решение Вопроса

Догадываясь, что ваша проблема была той же, с которой я столкнулся ... Существуют широко распространенные версии Boost.PropertyTree для поддержки юникода.

Для Config.xml, который настроен так:

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

Используйте код, подобный этому, чтобы разобрать его:

// 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");
    }
}
 CapersL18 апр. 2013 г., 03:16
Спасибо! Я сделаю это в следующий раз, когда буду работать над кодом.
 30 июн. 2018 г., 01:05
Я не думаю, что это сработает. read_xml принимает только ptree, а не wptree.

Ваш ответ на вопрос