Получены любопытно повторяющиеся шаблоны и ковариации
Предположим, у меня есть базовый класс, который клонирует производные классы:
class Base
{
public:
virtual Base * clone()
{
return new Base();
}
// ...
};
У меня есть набор производных классов, которые реализованы с использованием любопытно повторяющегося шаблона:
template
class CRTP : public Base
{
public:
virtual T * clone()
{
return new T();
}
// ...
};
И я пытаюсь извлечь из этого следующее:
class Derived : public CRTP
{
public:
// ...
};
Я получаю ошибки компиляции с эффектом:
error C2555: 'CRTP::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Я понимаю, что это, вероятно, результат того, что компилятор не полностью знает дерево наследования для Derived при создании экземпляра CRTP. Кроме того, замена типа возврата (T *) на (Base *) также компилируется. Тем не менее, я хотел бы знать, есть ли работа, которая сохраняет вышеуказанную семантику.