含模板的Vector执行push_back时抛出类型转换错误求助
问题分析与解决方案
首先,咱们来拆解你遇到的错误:编译器报错“无法从cars转换为const types&”,核心原因是静态类型不匹配——虽然*i的动态类型确实是types<supersport>(所以typeid显示正确),但在编译器看来,i的静态类型是cars*(因为car_vector存储的是基类指针),*i就是cars&,C++不允许直接把基类引用隐式转成子类引用,这是类型安全的硬性要求。
另外,你用i->get_type() == "class supersport"判断类型的方式也不太可靠——typeid().name()的输出是编译器相关的,不同环境下可能输出supersport、struct supersport或者其他格式,移植性很差。
修复方案
咱们用C++标准的动态向下转型(dynamic_cast)来解决这个问题,它既能安全判断类型,又能完成正确的转换:
方案1:返回存储对象的vector(拷贝对象)
vector<types<supersport>> get_ss() { vector<types<supersport>> to_return; for (auto i : car_vector) { // 尝试把基类指针转成types<supersport>*,只有实际类型匹配才会成功 types<supersport>* ss_car = dynamic_cast<types<supersport>*>(i); if (ss_car != nullptr) { // 转换成功,确认是目标类型 to_return.push_back(*ss_car); // 拷贝对象到新vector } } return to_return; }
方案2:返回存储指针的vector(更高效,避免拷贝)
如果你不想拷贝对象(比如types<supersport>比较大,或者有资源管理需求),可以改成返回指针vector,和原代码的风格保持一致:
vector<types<supersport>*> get_ss() { vector<types<supersport>*> to_return; for (auto i : car_vector) { types<supersport>* ss_car = dynamic_cast<types<supersport>*>(i); if (ss_car != nullptr) { to_return.push_back(ss_car); // 直接存储指针 } } return to_return; }
关键说明
dynamic_cast能工作的前提是cars是多态类(也就是至少有一个虚函数),从你代码里i->get_type()和i->toString()能正确调用子类实现来看,cars已经满足这个条件了,所以没问题。- 用
dynamic_cast做类型判断比字符串比较更可靠、更标准,完全避免了typeid输出格式不一致的问题。
内容的提问来源于stack exchange,提问作者victor dumitru
相关产品推荐
相关产品推荐

