我正在尝试将自己的codecvt
用于标准的iostream。我正在使用这一行:
std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));
rot13codecvt
只是一个例子,从the interwebs逐字无理地解除了。完整的可运行示例是here。我真正的codecvt做了不同的事情。
正如您在链接的实例中所看到的,这不是完全在g ++中工作。输出不是rot13d。从未调用自定义codecvt类的函数。但它在VS2012中运行良好。
我在“C”旁边尝试了其他语言环境,但没有一个正在运行。还尝试了一个示例here,结果相同。
我做错了什么?
答案 0 :(得分:2)
使用std::codecvt<...>
只需要文件流,并且不要求任何标准流对象按文件流实现。任何一种选择的实施者都有理由。 Dinkumware的实现在其大多数操作中使用<stdio.h>
,在这种情况下使用相同的实现是有意义的。 libstdc ++避免了一些开销,直接访问标准C和C ++流之间共享的缓冲区,因此使用不同的流实现。
使用文件流时,std::codecvt<...>
方面的使用应保持一致。
答案 1 :(得分:1)
codecvt标头存在于gcc 5.1。
中答案 2 :(得分: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++/