У меня есть два интерфейса:
class IElement
{
public:
virtual ~IElement() {}
};
class IContainer
{
public:
virtual ~IContainer() {}
virtual const std::vector<IElement *> &elements() const = 0;
};
Член 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 *>
. Очевидно, C ++ не осознает, что типы IElement
и CConcreteElement
связаны, когда они появляются в качестве аргумента шаблона.
Я тоже пробовал:
return static_cast<const std::vector<IElement *>>(m_vecElements);
Но это тоже не компилируется. Любые идеи, как я мог заставить это работать?