不兼容的模板实例

时间:2018-06-27 17:14:51

标签: c++ templates inheritance

我有两个界面:

elements

IContainer的成员IElement应该返回指向class CConcreteElement: public IElement { public: virtual ~CConcreteElement() {} void doSomething() { /* ... */ } }; class CConcreteContainer: public IContainer { private: std::vector<CConcreteElement *> m_vecElements; public: virtual ~CConcreteContainer() {} virtual const std::vector<IElement *> &elements() const override { return m_vecElements; } // PROBLEM HERE void doSomething() { for (CConcreteElement *pE : m_vecElements) { pE->doSomething(); } } }; 的指针向量。

然后我有两个具体的实现:

m_vecElements

以上内容无法编译,因为const std::vector<CConcreteElement *>的类型为const std::vector<IElement *>,而返回值应该为IElement类型。显然,当C ++ CConcreteElementreturn static_cast<const std::vector<IElement *>>(m_vecElements); 作为模板参数出现时,它们并没有关联。

我也尝试过:

.eslintrc

但这也不编译。有什么想法可以使它起作用吗?

1 个答案:

答案 0 :(得分:2)

您无法执行此强制转换,因为std::vector的元素类型是不变,这意味着,即使向量之间的关系相关,不同向量之间也没有关系(在继承意义上)。有关类型差异的更多信息,请参见this article

简短的答案是,您无法使用std::vector来执行此操作,但是可以通过提供 element getter 来代替 all elements getter

class IContainer
{
public:
    virtual ~IContainer() {}
    virtual const IElement *element(size_t index) const = 0;
};

class CConcreteContainer: public IContainer
{
private:
    std::vector<CConcreteElement *> m_vecElements;

public:
    virtual ~CConcreteContainer() {}
    virtual const CConcreteElement *element(size_t index) const override
    {
        return m_vecElements[index];
    }
};

请注意,覆盖方法的返回类型与基本方法不同。这是可能的,因为C ++支持协变返回类型。