2

codecvt標準の iostream で独自のものを使用しようとしています。私はこの行を使用しています:

std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));

rot13codecvtは単なる例であり、インターウェブから恥知らずに逐語的に持ち上げられてい ます。完全な実行可能な例はこちらです。私の本当の codecvt は何か違うことをします。

リンクされたライブの例でわかるように、これはg++ ではまったく機能しません。出力は rot13d ではありません。カスタム codecvt クラスの関数は呼び出されません。しかし、VS2012ではうまく機能します。

「C」以外のロケールを試しましたが、どれも機能しません。hereの例も試してみましたが、同じ結果です。

私は何を間違っていますか?

4

3 に答える 3

2

ファイル ストリームのみを使用する必要がstd::codecvt<...>あり、標準ストリーム オブジェクトのいずれかがファイル ストリームに関して実装されている必要はありません。実装者がどちらを選択するかには理由があります。Dinkumware の実装は<stdio.h>、ほとんどの操作で を使用しており、この場合、内部で同じ実装を使用することは理にかなっています。libstdc++ は、いくつかのオーバーヘッドを回避し、標準 C と C++ ストリーム間で共有されるバッファーに直接アクセスするため、異なるストリーム実装を使用します。

ファイル ストリームを使用する場合、std::codecvt<...>ファセットの使用は一貫している必要があります。

于 2015-02-04T13:51:27.363 に答える
0

g++ で提供される libstdc++ は、まだ c++11 標準を実装していません。私のバージョンでは、<codecvt>ヘッダーがまったくありません。

f.jardon@xxxx 14:40:40 ~
$ find /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/ -name codecvt

f.jardon@xxxx 14:41:17 ~

欠けているのはそれだけではありません。

f.jardon@xxxx 14:46:22 ~
$ grep -rl wbuffer_convert 'c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/'
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/wbuffer
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/xtest
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/xlocbuf

f.jardon@xxxx 14:46:25 ~
$ grep -rl wbuffer_convert /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/
于 2015-02-04T13:43:11.500 に答える