двоичный> T не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора - PullRequest
0 голосов
/ 25 февраля 2019

Я реализую общий двусвязный список и получаю сообщение об ошибке из-за операторов > и <</strong>.Кто-нибудь может мне помочь?

Примечание: я не могу использовать любые функции STL

typename SortedList<T>::iterator SortedList<T>::insert(const T& data) {
    iterator it = begin();

    if (head_->next_ == tail_) {
        Node* newNode = new Node(data, tail_, head_);
        head_->next_ = newNode;
        tail_->prev_ = newNode;
        it.curr_ = newNode;
        ++size_;
        return it;
    }
    else {
        while (it != end()) {
            if ((*it < data) && (*it > data || it.curr_->next_ == tail_)) { // this line is giving me error
                Node* newNode = new Node(data, it.curr_->next_, it.curr_);
                it.curr_->next_->prev_ = newNode;
                it.curr_->next_ = newNode;
                it.curr_ = newNode;
                ++size_;
                return it;
            }
            it++;
        }
    }
}

1 Ответ

0 голосов
/ 25 февраля 2019

Похоже, T не меньше или больше, чем сопоставимо.

Как это исправить?

  1. Либо сделать Tсопоставим
  2. или используйте объект сравнения для сравнения элементов, как это делают стандартные отсортированные контейнеры.

как сделать T меньше или больше чем сопоставимым?

Если, например, вы использовали класс foo в качестве T для создания экземпляра вашего шаблона, то вы должны сделать foo сопоставимым.

Этого можно достичьопределив bool operator<()(const foo&,const foo&), чтобы сделать его менее чем сопоставимым, и bool operator>()(const foo&,const foo&), чтобы сделать его более чем сопоставимым.Обратите внимание, что эти функции, вероятно, должны реализовать строгое отношение слабого порядка для правильной работы вашего алгоритма.

Кроме того, вы можете использовать b < a вместо a > b в своем алгоритме, чтобы только одно направлениетребуется сопоставимость.

Это общий двусвязный список, поэтому он должен работать для всех типов данных, верно?

Не все типы сопоставимы.Ваша функция сравнивает объекты этого типа, поэтому нет: ваш шаблон работает не для всех типов данных.Он работает только для тех типов данных, которые сопоставимы.

Если вы будете использовать объект сравнения, то ваш связанный список может также работать для несопоставимых типов, для которых может быть записан объект сравнения.

Можете ли вы объяснить мне, как сделать объект сравнения?

Давайте рассмотрим класс foo в качестве примера.Вы можете создать объект сравнения для этого класса, написав класс (назовем его Comp), который перегружает следующий оператор вызова функции:

bool Comp::operator()(const foo&, const foo&) const

Как и в случае сопоставления foo, эта функция такжедолжен реализовать строгое отношение слабого порядка.Экземпляр такого класса является объектом сравнения.Может быть достаточно лямбды.

Вы должны использовать аргумент шаблона в шаблоне списка, чтобы позволить пользователю шаблона предоставить объект сравнения, который может сравнивать объекты типа T.Сохраните объект как член списка и используйте объект сравнения только для сравнения элементов списка вместо реляционных операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...