好的,首先我不是天生的 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", "default value here")]
我真的完全不知道如何解决这个问题,并且似乎无法在网上找到任何东西来帮助我了解究竟是什么问题。任何提示或信息将不胜感激。
编辑
所以我注释掉了与 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