Проблема с деревом свойств Boost при преобразовании в Unicode

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

Итак, у меня есть бесплатное приложение, которое я сделал, которое использует дерево свойств из библиотек Boost. Я разработал все приложение (в VS2010) с настройкой «Использовать многобайтовый набор символов». Я решил, что пришло время просмотреть и обновить приложение для поддержки Unicode, поскольку есть люди со сложными наборами символов, которые я хотел бы улучшить.

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

Оба они взяты из stream_translator.hpp (/boost/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

person CapersL    schedule 13.05.2012    source источник
comment
Они оба исходят из stream_translator.hpp Нет, они исходят из вашего кода, передающего wstrings коду Boost. VS2010 покажет список экземпляров шаблона. Следуйте ему, пока не доберетесь до вашего кода и не опубликуете его.   -  person Nicol Bolas    schedule 13.05.2012
comment
Чтобы было ясно, я никогда не собирался обвинять код Boost, я знал, что где-то это был мой код. Я был ленив и надеялся, что у кого-то есть простой ответ. Я проделал работу, чтобы найти точную точку отказа (для одной из проблем) и сделал указанные выше обновления. Обратите внимание, что приведенный выше код работает без ошибок при использовании Multi-Byte, только при переключении на Unicode.   -  person CapersL    schedule 13.05.2012


Ответы (1)


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

Для 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");
    }
}
person BeReal82    schedule 17.04.2013
comment
Я не думаю, что это сработает. read_xml принимает ТОЛЬКО ptree, а не wptree. - person cardinalPilot; 30.06.2018