ковариация между классами не распознается за пределами производного класса

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.

Я уверен, что мой код соответствует требованиям для ковариации, пожалуйста, исправьте меня, если я что-то упущу

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector