まず最初に、私は生まれつき C++ 開発者ではありません。私はいくつかのものをまとめることができ、それはうまく動作しますが、専門家の目を通してそれはゴミのように見えると確信しています =)
そこで、Boost ライブラリの Property Tree を使用するフリーウェア アプリを作成しました。[マルチバイト文字セットを使用] 設定を使用して (VS2010 で) アプリ全体を開発しました。複雑な文字セットを使用しているユーザーがいて、より適切にサポートしたいと考えているため、Unicode をサポートするようにアプリを調べて更新する時期だと判断しました。
ワイド文字列を使用するようにすべての参照と呼び出しを変更し、必要なすべての変換を行うという面倒なプロセスを経ました。しかし、私はある時点で完全に困惑しました.2つのコンパイラエラーしか残っていません.
これらは両方とも、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内から来ています [eg ptree.get("some.path", "default value here")]
この問題を解決する方法がまったくわからず、問題の正確な内容を理解するのに役立つものをオンラインで見つけることができないようです。ヒントや情報をいただければ幸いです。
編集
そのため、ptree に関連するすべてをコンパイルするまでコメントアウトし、それらを再度追加し始めました。.get を正常に呼び出すことができることがわかりました。36 行目のエラーが表示されるのは get_child です (他のプロジェクトはまだ行っていませんが、 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