小编Cap*_*rsL的帖子

转换为Unicode时提升属性树问题

好的,首先,我不是一个C++开发人员; 我已经设法把一些东西放在一起,它工作正常,但我确信通过专家的眼睛,它看起来像垃圾=)

所以我有一个免费软件应用程序,我使用Boost库中的Property Tree.我使用"使用多字节字符集"设置开发了整个应用程序(在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;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

第33行的错误是:

Error   347 error C2679: binary '<<' : no operator found which takes a right-hand operand of type …
Run Code Online (Sandbox Code Playgroud)

c++ winapi visual-studio-2010 boost-propertytree

6
推荐指数
1
解决办法
4214
查看次数

C++ Boost属性树按属性限定符更新现有节点

好的,这里是XML结构的示例:

<config>
  <Ignored>
    <Ignore name="Test A">
       <Criteria>
          <value>actual value</value>
       </Criteria>
    </Ignore>
    <Ignore name="Test B">
       <Criteria>
          <value>actual value</value>
       </Criteria>
    </Ignore>
  </Ignored>
<config>
Run Code Online (Sandbox Code Playgroud)

我希望能够做两件事:

  1. 直接执行获取Test A元素,而不必循环所有Ignore元素.就像属性上的选择器一样.
  2. 如果没有别的,我需要一种更新任何一个忽略元素的方法,似乎无法搞清楚

我是否必须删除该元素并重新创建它?我似乎无法找到一种方法来执行一个put,它通过一个属性(在那个级别上是唯一的)来限定一个元素(在同一级别有许多同名的元素).

就像是:

pt.put("config.Ignored.Ignore.<xmlattr>.name='Test A'.Criteria.value",some_var)
Run Code Online (Sandbox Code Playgroud)

或任何其他可以实现最终目标的东西.非常感谢你!

完全披露:我对C++很陌生,可能会遗漏一些明显的东西.

c++ boost-propertytree

4
推荐指数
1
解决办法
3752
查看次数