簡體   English   中英

使用std :: basic_istringstream時的std :: bad_cast <unsigned short>

[英]std::bad_cast when using std::basic_istringstream<unsigned short>

我正在嘗試借助std::basic_stringistringstream處理UTF-16字符串(放置在緩沖區buf )。 此代碼中發生異常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相同的代碼可以正常工作。

在與charwchar_t不同的字符類型上實例化IOStream相當重要。 流需要存在許多std::locale構面。 沒有它們,它們將無法正常運行。 對於嘗試的操作,您至少需要:

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

其中cT是流的字符類型。 其中的最后一個只需要實例化,而其他的則需要實現。 當然,您還需要通過將其設置為全局語言環境或使用stream.imbue()來確保為流安裝了std::locale

就我個人而言,我認為這總體上是錯誤的方法:進入系統時,字符應轉換為內部表示,離開系統時應轉換為外部表示(這就是std::codecvt<...>的目的) std::codecvt<...>方面)。 但是,這似乎是一場失敗的斗爭,人們覺得他們想在內部使用編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM