首页 > 解决方案 > 'const DList 的无效转换* const' 到 'DList*' [-fpermissive] 返回对象时

问题描述

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_iterator 对象时,这些行下的“从 'const DList* const' 到 'DList*' [-fpermissive] 的无效转换”。

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

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

我对此错误消息进行了一些研究,但没有一个答案可以帮助我理解我的问题是什么。我无法弄清楚为什么它会给我这个错误,希望得到帮助和澄清。

标签: c++type-conversionconstants

解决方案


const_iterator(Node* curr, DList* theList)

接受一个非const DList *,但它被称为

    return const_iterator(front_, this);

const方法

const_iterator cbegin() const

方法this中的是,所以这里是 a并且不能用作期望非 的参数的参数。constconstthisconst 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_;

或者您刚刚移动了错误消息。问题中当前未完全实现的其他成员函数可能需要进行修改。

在我看来这应该是可能的。


推荐阅读