class tree {
protected:
Node* root;
tree* next;
tree* prev;
tree* sufmin;
heap* parent;
public:
H_tree(Node* r);
virtual void combine(H_tree* T);
void update_suffix_min();
virtual void remove_tree();
virtual tree* get_suffix_min();
virtual tree* get_next();
virtual tree* get_prev();
virtual Node* get_root();
virtual heap* get_parent();
int get_rank();
virtual void set_next(tree* n);
virtual void set_prev(tree* p);
virtual void set_root(Node* r);
virtual void set_suffix_min(tree* sufmin);
virtual void set_parent(heap* p);
virtual ~tree();
};
Я получил другой класс из этого.
class Utree : public tree
{
UNode *ro;
Uheap *pa;
Utree *ne, *pr, *su;
public:
UIH_tree(UNode* r);
void combine(Utree *T);
void remove_tree();
virtual Utree* get_suffix_min();
virtual Utree* get_next();
virtual Utree* get_prev();
virtual UNode *get_root();
virtual Uheap* get_parent();
void set_next(Utree* n);
void set_prev(Utree* p);
void set_root(UNode* r);
void set_suffix_min(Utree* sufmin);
void set_parent(Uheap* p);
}
Теперь моя проблема в том, что функции get_root () и get_parent () вызывают ошибку, потому что возвращаемые типы не являются ковариантными. Но Uheap и UNode происходят от кучи и Node.
Класс UHeap выдает ту же ошибку с функциями, которые используют tree * и Utree * в качестве возвращаемых значений, а UNode делает то же самое.
Что меня действительно смущает, так это то, что, в отличие от классов Uheap и Unode, в классе Utree нет никаких проблем с ковариацией Utree * и tree *.
То же самое касается Unode * и node * в классе Unode.
Функции, которые создают ошибки, возвращают только указатели, не более того.
Это проблема с компилятором? Я использую MSVC2010.
выдержка из стандарт с ++:
Тип возврата переопределяемой функции должен быть либо идентичным типу возврата переопределенной функции, либо ковариантным по отношению к классам функций. Если функция D :: f переопределяет функцию B :: f, возвращаемые типы функций ковариантны, если они удовлетворяют следующим критериям:
— оба являются указателями на классы, оба являются lvalue-ссылками на классы, или оба являются rvalue-ссылками на классы
— класс в возвращаемом типе B :: f является тем же классом, что и класс в возвращаемом типе D :: f, или является однозначным и доступным прямым или косвенным базовым классом класса в возвращаемом типе D: : е
— и указатели, и ссылки имеют одинаковую квалификацию cv, а тип класса в возвращаемом типе D :: f имеет ту же квалификацию cv, что и квалификационный класс или меньше, чем тип класса в возвращаемом типе B :: f.
Я уверен, что мой код соответствует требованиям для ковариации, пожалуйста, исправьте меня, если я что-то упущу
Задача ещё не решена.