неверное преобразование из 'const DList <int>* const' в 'DList <int>*' [-fpermissive] при возврате объекта - PullRequest
0 голосов
/ 05 октября 2019
class DList{
    struct Node{
        T data_;
        Node* next_;
        Node* prev_;
        Node(const T& data=T{},Node* next=nullptr, Node* prev=nullptr){
            data_=data;
            next_=next;
            prev_=prev;
        }
    };
    Node* front_;
    Node* back_;
public:
    DList(){
        front_=nullptr;
        back_=nullptr;
    }
    void push_front(const T& data);
    ~DList();
class const_iterator{
    friend class DList;
    DList* myList_;
    Node* curr_;
    const_iterator(Node* curr, DList* theList){
        curr_ = curr;
        myList_ = theList;
    }
public:
    const_iterator(){
        myList_ = nullptr;
        curr_ = nullptr;
    }
    const_iterator operator++(){}
    const_iterator operator++(int){}
    const_iterator operator--(){}
    const_iterator operator--(int){}
    bool operator==(const_iterator rhs){}
    bool operator!=(const_iterator rhs){}
    const T& operator*()const{}
};
class iterator:public const_iterator{
    friend class DList;
    iterator(Node* curr, DList* theList):const_iterator(curr,theList){}
public:
    iterator():const_iterator(){}
    iterator operator++(){}
    iterator operator++(int){}
    iterator operator--(){}
    iterator operator--(int){}
    T& operator*(){}
    const T& operator*()const{}

};
const_iterator cbegin() const {
    return const_iterator(front_,this);
}
iterator begin(){
    return iterator(front_,this);

}
const_iterator cend() const{
    return const_iterator(nullptr,this);
}
iterator end(){
    return iterator(nullptr,this);

}
};

Это мое назначение и код для связанного списка, моя задача состоит в том, чтобы реализовать классы итераторов для связанного списка, я просто реализовал функции начала и конца, когда я запускаю тестер, чтобы проверить, работают ли эти функцииработаю, я получил ошибку "недопустимое преобразование из 'const DList * const' в 'DList *' [-fpermissive]" в строках для них при возврате объекта const_iterator.

const_iterator cbegin() const {
    return const_iterator(front_,this);
}

const_iterator cend() const{
    return const_iterator(nullptr,this);
}

Я провел некоторое исследованиедля этого сообщения об ошибке, но ни один из ответов не помогает мне понять, в чем заключается моя проблема. Я не могу понять, почему он дает мне эту ошибку, был бы признателен за помощь и разъяснения.

1 Ответ

1 голос
/ 05 октября 2019
const_iterator(Node* curr, DList* theList)

принимает не- const DList *, но вызывается с

    return const_iterator(front_, this);

из const метода

const_iterator cbegin() const

this вconst метод равен const, поэтому здесь this является const DList * и не может использоваться в качестве аргумента для параметра, ожидающего не const DList *.

Тривиальное решениедолжен заменить

    const_iterator(Node* curr, DList* theList)
    {
        curr_ = curr;
        myList_ = theList;
    }

на

    const_iterator(Node* curr, const DList* theList): 
        curr_(curr),
        myList_ (theList) // using member initializer list for reasons of taste
    {
    }

и следовать правильности const до конца, если это возможно. Например, элемент

DList* myList_;

должен стать

const DList* myList_;

, или вы только что переместили сообщение об ошибке. В других функциях-членах, которые в настоящее время не полностью реализованы в вопросе, могут потребоваться изменения.

Мне кажется, это должно быть возможно.

...