返回对象时从'const DList <int> * const'到'DList <int> *'的无效转换[-fpermissive]

时间:2019-10-04 23:39:02

标签: c++ type-conversion const

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);

}
};

这是我的任务,也是链表的代码,我的任务是为链表实现迭代器类,我刚刚实现了begin和end函数,当我运行测试仪检查那些函数是否起作用时,我返回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);
}

我对此错误消息进行了一些研究,但是没有答案可以帮助我理解问题所在。我不知道为什么会给我这个错误,希望能得到帮助和澄清。

1 个答案:

答案 0 :(得分:1)

const_iterator(Node* curr, DList* theList)

接受非const DList *,但使用来调用

    return const_iterator(front_, this);

通过const方法

const_iterator cbegin() const

this方法中的constconst,因此这里thisconst 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_;

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

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