--- boost/property_tree/detail/info_parser_read.hpp.orig 2010-10-25 13:47:44.690986921 -0400 +++ boost/property_tree/detail/info_parser_read.hpp 2010-10-25 14:49:14.345252040 -0400 @@ -288,7 +288,7 @@ else // Key text found { std::basic_string key = read_key(text); - last = &stack.top()->push_back( + last = (Ptree*)&stack.top()->push_back( std::make_pair(key, Ptree()))->second; state = s_data; } @@ -322,8 +322,20 @@ { bool need_more_lines; std::basic_string data = read_data(text, &need_more_lines); + if (need_more_lines) + { last->data() = data; - state = need_more_lines ? s_data_cont : s_key; + state = s_data_cont; + } + else + { + typename translator_between< + typename Ptree::data_type, + std::basic_string >::type tr; + last->data() = *(typename Ptree::data_type*) + &tr.put_value(data); + state = s_key; + } } @@ -339,9 +351,24 @@ if (*text == Ch('\"')) // Continuation must start with " { bool need_more_lines; - std::basic_string data = read_string(text, &need_more_lines); - last->put_value(last->template get_value >() + data); - state = need_more_lines ? s_data_cont : s_key; + std::basic_string data = + last->template get_value >() + + read_string(text, &need_more_lines); + + if (need_more_lines) + { + last->data() = data; + state = s_data_cont; + } + else + { + typename translator_between< + typename Ptree::data_type, + std::basic_string >::type tr; + last->data() = *(typename Ptree::data_type*) + &tr.put_value(data); + state = s_key; + } } else BOOST_PROPERTY_TREE_THROW(info_parser_error("expected \" after \\ in previous line", "", 0));