C++ 为什么会出现这样的错误:';静态强制转换';:无法从';标准::向量<_Ty>';至';标准::向量<_Ty>';

C++ 为什么会出现这样的错误:';静态强制转换';:无法从';标准::向量<_Ty>';至';标准::向量<_Ty>';,c++,oop,vector,C++,Oop,Vector,我有一个基类和几个派生自它的类。基类有一个typeID,所有派生类都被赋值,因此我可以区分。我希望创建一个搜索函数,该函数使用一个通用的vector::迭代器查看向量列表。但是,我无法将静态_转换为基类迭代器,我得到了上面的错误 我已经开发了另一种解决方案,但是我想知道是什么样的语言机制阻止了我这么做 class CItem { public: enum ItemType { enumed types here }; CItem();

我有一个基类和几个派生自它的类。基类有一个typeID,所有派生类都被赋值,因此我可以区分。我希望创建一个搜索函数,该函数使用一个通用的vector::迭代器查看向量列表。但是,我无法将静态_转换为基类迭代器,我得到了上面的错误

我已经开发了另一种解决方案,但是我想知道是什么样的语言机制阻止了我这么做

    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的协变数组。