[解決済み] Unicode への変換時に発生する Boost プロパティツリーの問題
質問
OK、まず私は元々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 最終的に値を取得するための呼び出しとして始まる [例:ptree.get("some.path", "default value here")].
この問題を解決する方法が全く分からず、また、この問題を解決するために 何か この問題が何であるかを理解するために、オンラインを利用することができます。 何かヒントや情報があれば、非常にありがたいのですが。
EDIT
そこで、コンパイルできるようになるまで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
解決方法は?
あなたの問題は、私が遭遇したのと同じだと推測しています... Boost.PropertyTreeには、ユニコードに対応したワイドキャラクターバージョンが存在します。
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");
}
}
関連
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 配列のベクトルを扱う正しい方法