C++ 为什么会出现这样的错误:';静态强制转换';:无法从';标准::向量<_Ty>';至';标准::向量<_Ty>';
我有一个基类和几个派生自它的类。基类有一个typeID,所有派生类都被赋值,因此我可以区分。我希望创建一个搜索函数,该函数使用一个通用的vector::迭代器查看向量列表。但是,我无法将静态_转换为基类迭代器,我得到了上面的错误 我已经开发了另一种解决方案,但是我想知道是什么样的语言机制阻止了我这么做C++ 为什么会出现这样的错误:';静态强制转换';:无法从';标准::向量<_Ty>';至';标准::向量<_Ty>';,c++,oop,vector,C++,Oop,Vector,我有一个基类和几个派生自它的类。基类有一个typeID,所有派生类都被赋值,因此我可以区分。我希望创建一个搜索函数,该函数使用一个通用的vector::迭代器查看向量列表。但是,我无法将静态_转换为基类迭代器,我得到了上面的错误 我已经开发了另一种解决方案,但是我想知道是什么样的语言机制阻止了我这么做 class CItem { public: enum ItemType { enumed types here }; CItem();
class CItem {
public:
enum ItemType { enumed types here };
CItem();
CItem(const string Name, ItemType itemType, const float cost, const float weight);
virtual ~CItem();
CItem(const CItem &);
CItem& operator=(const CItem &);
int itemID() const { return m_itemID; }
void itemID(const int id) { m_itemID = id; }
protected:
ItemType m_Type;
};
class CDerivedClassA: public CItem {
public:
CDerivedClassA() {};
virtual ~CDerivedClassA() {};
protected:
private:
};
class CDerivedClassB: public CItem {
public:
CDerivedClassB() {};
virtual ~CDerivedClassB() {};
protected:
private:
};
void CContainer::Search(ItemType it) {
vector<CItem>::iterator iter;
switch (it) {
case IT_GENERAL:
iter = m_GeneralItemList.begin();
break;
case IT_A:
iter = (static_cast<vector<CItem>>(m_DerivedListA)).begin();
break;
case IT_B:
iter = (static_cast<vector<CItem>>(m_DerivedListB)).begin();
break;
}
}
类CItem{
公众:
枚举项类型{此处枚举类型};
CItem();
CItem(常量字符串名称、ItemType ItemType、常量浮动成本、常量浮动权重);
虚拟~CItem();
CItem(const CItem&);
CItem&运算符=(const CItem&);
int itemID()常量{return m_itemID;}
void itemID(const int id){m_itemID=id;}
受保护的:
项目类型m_类型;
};
类别CDerivedClassA:公共城市{
公众:
CDerivedClassA(){};
虚拟~CDerivedClassA(){};
受保护的:
私人:
};
类别CDerivedClassB:公共城市{
公众:
CDerivedClassB(){};
虚拟~CDerivedClassB(){};
受保护的:
私人:
};
void CContainer::搜索(ItemType it){
向量:迭代器iter;
开关(it){
案例IT_概述:
iter=m_GeneralItemList.begin();
打破
案例一:
iter=(静态(m_DerivedListA)).begin();
打破
案例IT_B:
iter=(静态_cast(m_DerivedListB)).begin();
打破
}
}
向量::将丢失派生类型信息(这称为切片)。剩下的就是属于基础的每个实例的部分。如果您需要在一个容器中同时处理基类型和派生类型(或仅处理多个派生类型),则需要使用指针容器而不是实例容器。我们不知道m_DerivedListA
或m_DerivedListB
是什么,因此很难说您在这方面有什么进展。此外,您的替代解决方案创建一个临时副本,然后将iter
设置为悬挂迭代器到该临时向量中。它们总是更可取的。基本上,您将看到另外6行:struct CItem{};结构m_DerivedListA:CItem{}代码>等等。是的,描述是准确的,但是如果您在类声明中犯了错误怎么办?仅仅因为错误出现在线路上,并不意味着实际的故障就在那里。我明白了。我还搞砸了,忘了std::vector
不允许从其他向量类型构造。这就是造成抛出错误的原因。向量
不能转换为向量
,如果转换为向量,情况会更糟,因为示例会编译并留下悬空迭代器。具有协变只读列表类型的情况并不少见(例如,Kotlin中的列表
,C中的IReadOnlyList
)。在C++中,这可能最接近视图或<代码> CONTRORATIORATOR> <代码>。但是,const_迭代器
s没有指定为协变的,因此您需要自己的东西。例如,一个多态列表视图
,其中一个视图转换为派生*
列表,可以转换为一个视图转换为基本*
列表。对于一般容器来说,很难开始工作。只读要求的原因是,在其他情况下,围绕此转换的安全性会发生故障。请参阅Java的协变数组。