Почему я получаю "недопустимое преобразование из константного указателя в указатель? - PullRequest
0 голосов
/ 18 октября 2018

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

Этот указатель затем используется при инициализации объекта OULink (узла списка).

Внутри моего класса OULink я пытаюсь установить указатель данных на = объект, который я пытаюсьдобавить, и вот где я получаю сообщение об ошибке:

ошибка: неправильное преобразование из 'const NvraRecord *' в 'NvraRecord *' [-fpermissive] this-> data = item;

Я думал, так как они оба были типа T *, я мог назначить одно другому.

template <typename T>
class OULinkedList {
    template <typename F>
    friend class OULinkedListEnumerator;
private:
    Comparator<T>* comparator = NULL;               // used to determine list order and item equality
    unsigned long size = 0;                         // actual number of items currently in list
    OULink<T>* first = NULL;                        // pointer to first link in list
    OULink<T>* last = NULL;                         // pointer to last link in list
public:
    OULinkedList(Comparator<T>* comparator);        // creates empty linked list with comparator
    virtual ~OULinkedList();                        // deletes all links and 
template <typename T>
bool OULinkedList<T>::append(const T* item) {


    if(this->first == NULL){

        OULink<NvraRecord> currentNode(item);
        this->first = &currentNode;

    }else{

    }
    std::cout << *this->first->data << std::endl;
    return false;
}



template <typename T>
class OULink {
    template <typename F>
    friend class OULinkedList;
    template <typename F>
    friend class OULinkedListEnumerator;
private:
    T* data = NULL;                                     // pointer to data item of any type
    OULink* next = NULL;                                // pointer to next link
public:
    OULink(const T* item);
    virtual ~OULink();
};

template<typename T>
OULink<T>::~OULink(){

}
// Implementation goes here
template<typename T>
OULink<T>::OULink(const T* item){

    this->data = item;
}

1 Ответ

0 голосов
/ 18 октября 2018

Конструктор OULink принимает const T* item, который является указателем на const T. OULink.data может хранить T*, который является указателем на неконстантный T.

Вы не можете назначить const T* для T*, потому что const - это контракт, который говорит: «Я не позволю объекту, на который я указываю, измениться».Если бы вы могли присвоить T*, этот указатель позволил бы изменить объект, что нарушило бы этот контракт.

Возможно, вы захотите изменить конструктор OULink(const T* item); на OULink(T* item);.

...