编译报错:std命名空间中bad_cast未命名类型问题求助(附代码)
解决‘std::bad_cast’未命名类型的编译错误
这个编译错误的原因很直接:std::bad_cast这个异常类型是定义在<typeinfo>标准头文件里的,而你的代码中没有包含这个头,所以编译器根本不知道它是什么。
解决步骤:
- 在代码最顶部添加
<typeinfo>的包含语句即可。
修改后的完整代码:
#include <iostream> #include <typeinfo> // 必须包含这个头才能使用std::bad_cast using std::cout; using std::endl; using std::cerr; using std::bad_cast; class A { public: virtual ~A() { } }; class B: public A { public: }; int main() { int n = 4; A a; A& base = a; B* ptr = dynamic_cast<B*>(&base); if (ptr == NULL) { cerr << "base is not a B"; } try { B& derived = dynamic_cast<B&>(base); derived = *ptr; } catch (bad_cast&) { cerr << "base is not a B"; } if (n == 3) { } return 0; }
额外说明:
- 如果你不想用
using std::bad_cast;简化代码,也可以在catch块里保留std::bad_cast&的写法,只要保证<typeinfo>头被包含就没问题。 - 为什么指针版本的
dynamic_cast没报错?因为当dynamic_cast转换指针失败时,只会返回NULL,不需要依赖bad_cast类型;只有转换引用失败时才会抛出bad_cast异常,这时候才需要这个头文件的支持。
内容的提问来源于stack exchange,提问作者WantToKnowMath
相关产品推荐
相关产品推荐

