Тип возврата переопределяющей виртуальной функции отличается и не является ковариантным в структуре данных - PullRequest
0 голосов
/ 29 января 2020

Когда я пытаюсь скомпилировать, я получаю странную ошибку: «переопределение типа возвращаемого значения виртуальной функции отличается и не является ковариантным», я думаю, что проблема в Node. Я думаю, что BTree<T>::Node - это не то же самое, что BSTree<T>::Node.

Базовый класс:

#ifndef BINARY_TREE_H
#define BINARY_TREE_H

template < typename T >
class BTree {
protected:
    struct Node {
        T key;
        Node* left;
        Node* right;

        Node() {}
        Node(
            const T& key,
            Node* left = nullptr,
            Node* right = nullptr)
            : left(left), right(right), key(key) {}
    };
public:
    BTree();
    virtual ~BTree();
    virtual Node* search(const T& key);


private:
    Node* search(const T& key, Node* root);

private:
    Node* root;
};

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key, BTree<T>::Node* root) {

    //some code
}

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key) {
    return search(key, root);
}

#endif // BINARY_TREE_H

Производный класс:

#ifndef BINARY_SEARCH_TREE_H
#define BINARY_SEARCH_TREE_H

#include "binary_tree.h"

template < typename T >
class BSTree : public BTree<T> {
protected:
    struct Node {
        T key;
        Node* left;
        Node* right;

        Node() {}
        Node(
            const T& key,
            Node* left = nullptr,
            Node* right = nullptr)
            : left(left), right(right), key(key) {}
    };
public:
    BSTree();
    ~BSTree() override;  
    Node* search(const T& key) override;

private:
    Node* search(const T& key, Node* root);

private:
    Node* root;
};

template < typename T >
typename BSTree<T>::Node* BSTree<T>::search(const T& key, BSTree<T>::Node* root) {
    //some code
}

template < typename T >
typename BSTree<T>::Node* BSTree<T>::search(const T& key) {
    return search(key, root);
}

#endif // BINARY_SEARCH_TREE_H

Ответы [ 2 ]

5 голосов
/ 29 января 2020

Хотя BSTree<T> является производным от BTree<T>, между BSTree<T>::Node и BTree<T>::Node нет никакой связи. Следовательно, указатель на последний не может быть преобразован в указатель на первый. BTree<T>::search возвращает указатель на BTree<T>::Node. Следовательно, любое переопределение этой функции в производном классе должно возвращать указатель, который конвертируется в BTree<T>::Node*.

Что, как ранее установлено, BSTree<T>::Node* не является.

Действительно, почему BSTree<T>::Node существует, если он делает то же самое, что и BTree<T>::Node?

0 голосов
/ 30 января 2020

Вот правильный код. Будьте внимательны, добавьте typename, прежде чем увидите BTree<T>::Node.

Базовый класс:

#ifndef BINARY_TREE_HPP
#define BINARY_TREE_HPP

template < typename T >
class BTree {
protected:
    struct Node {
        int key;
        Node* left;
        Node* right;

        Node() {}
        Node(
            const int& key,
            Node* left = nullptr,
            Node* right = nullptr)
            : left(left), right(right), key(key) {}
    };
public:
    BTree();
    virtual ~BTree();    
    virtual Node* search(const T& key);

private:
    Node* search(const T& key, Node* root);

private:
    Node* root;
};

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key, BTree<T>::Node* root) {

    // some code
}

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key) {
    return search(key, root);
}

Производный класс:

#ifndef BINARY_SEARCH_TREE_HPP
#define BINARY_SEARCH_TREE_HPP

#include "binary_tree.hpp"

template < typename T >
class BSTree : public BTree<T> {
public:
    BSTree();
    ~BSTree() override;
    typename BTree<T>::Node* search(const T& key) override;

private:
    typename BTree<T>::Node* search(const T& key, typename BTree<T>::Node* root);

private:
    typename BTree<T>::Node* root;

};

template < typename T >
typename BTree<T>::Node* BSTree<T>::search(const T& key, typename BTree<T>::Node* root) {

    // some code
}

template < typename T >
typename BTree<T>::Node* BSTree<T>::search(const T& key) {
    return search(key, root);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...