std :: bad_cast使用std :: basic_istringstream <unsigned short =“”> </unsigned>

时间:2013-10-07 10:37:14

标签: c++ string gcc istringstream stdstring

我正在尝试在bufstd::basic_string的帮助下处理UTF-16字符串(放在缓冲区istringstream中)。此代码中出现异常std::bad_cast。我的代码有问题吗?或者gcc的STL无法处理unsigned int(16位)符号?

const unsigned short * buf;
// ... fiilling buf
std::basic_string<unsigned short> w(buf);
std::basic_istringstream<unsigned short> iss(w);

unsigned int result;
try { iss >> result; }
catch (std::exception& e)
{
   const char * c = e.what();
}

std::wstringstd::wistringstream的相同代码正常运行。

1 个答案:

答案 0 :(得分:1)

charwchar_t之外的不同字符类型上实例化IOStream是非常重要的。流需要存在多个std::locale方面。没有它们,它们将无法正常运作。对于您至少需要尝试的操作:

  • std::ctype<cT>
  • std::numpunct<cT>
  • std::num_get<cT>

其中cT是流的字符类型。其中最后一个应该只需要实例化,但其他需要实现。当然,您还需要确保为流安装std::locale,方法是将其设置为全局区域设置或使用stream.imbue()

就个人而言,我认为这总体上是错误的方法:进入系统时应将字符转换为内部表示,并在离开系统时转换为外部表示(这是std::codecvt<...>的目的小)。然而,似乎这是一场失败的战斗,人们觉得他们想要在内部捣乱编码。