C++ std::basic_ifstream抛出std::bad_cast

C++ std::basic_ifstream抛出std::bad_cast,c++,file-io,c++11,io,ifstream,C++,File Io,C++11,Io,Ifstream,我正在尝试使用下面的代码从文件中读取数据。(请注意,您需要在GCC上启用C++11功能才能进行编译。) #包括 typedef无符号字符字节; int main() { std::string filename=“test.cpp”; std::basic_ifstream in(文件名,std::basic_ifstream::in | std::basic_ifstream::binary); in.异常(std::ios::failbit | std::ios::badbit); 字节bu

我正在尝试使用下面的代码从文件中读取数据。(请注意,您需要在GCC上启用C++11功能才能进行编译。)

#包括
typedef无符号字符字节;
int main()
{
std::string filename=“test.cpp”;
std::basic_ifstream in(文件名,std::basic_ifstream::in | std::basic_ifstream::binary);
in.异常(std::ios::failbit | std::ios::badbit);
字节buf[5];
in.read(buf,5);
返回0;
}
但是,在读取数据时,我会遇到一个异常:

terminate called after throwing an instance of 'std::bad_cast' what(): std::bad_cast 在抛出“std::bad_cast”实例后调用terminate what():std::错误的演员阵容 调用in.read(buf,5)命令时会发生这种情况

我知道我可以通过不设置我设置的异常掩码来抑制此异常,但这并不能解决问题,它只会屏蔽它。如果没有异常掩码,代码将继续工作,但读取0个字符


有人知道为什么会抛出此异常吗?我该如何让它消失呢?

如果你将
字节重新定义为
char
,那么
坏演员
异常将不再存在 发生

我假设
basic\u ifstream
模板没有完全调试
无符号字符
专门化。根据标准§27.3,
char\u traits
只需由库实例化
对于
ChartType
=
{char | char16 | t | char32 | t | wchar | t}
c++STL只包含两种字符特征:

   struct char_traits < char >;
   struct char_traits <wchar_t >;
struct char\u traits;
结构特征;
对于发布工作的代码,需要定义
char\u traits


对我来说,它甚至没有编译:
没有匹配的构造函数来初始化'std::basic_ifstream
@H2CO3。如简介中所述,您需要启用C++11。否则,
basic\u ifstream
的构造函数不存在。替代修复方法:使用
filename.c_str()
而不是
filename
。这个问题已经在这里解决了:它完全实现了char\u traits和codecvt
   struct char_traits < char >;
   struct char_traits <wchar_t >;