Похоже, T не меньше или больше, чем сопоставимо.
Как это исправить?
- Либо сделать
T
сопоставим - или используйте объект сравнения для сравнения элементов, как это делают стандартные отсортированные контейнеры.
как сделать 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
.Сохраните объект как член списка и используйте объект сравнения только для сравнения элементов списка вместо реляционных операторов.