Вопрос по winapi, boost-propertytree, c++, visual-studio-2010 – Увеличена проблема с деревом свойств при конвертации в Unicode

6

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

Ваш Ответ

1   ответ
7

Догадываясь, что ваша проблема была той же, с которой я столкнулся ... Существуют широко распространенные версии 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");
    }
}
Спасибо! Я сделаю это в следующий раз, когда буду работать над кодом. CapersL
Я не думаю, что это сработает. read_xml принимает только ptree, а не wptree.

Похожие вопросы