#c #object #compare #priority-queue
#c #объект #Сравнить #приоритет-очередь
Вопрос:
Мне нужна функция сравнения для использования в моей очереди приоритетов для сравнения объектов. Объекты должны быть отсортированы по соотношению объектов. По какой-то причине функция RatioCompare не будет работать / компилироваться.
Компилятор выдает следующую ошибку:
В функции-члене
bool RatioCompare::operator()(const Itemamp;, const Itemamp;) const
:joulethief.cpp:58
: ошибка: передача ‘const Item’ в качестве ‘этого’ аргументаdouble Item::getRatio()
отбрасываемых квалификаторов joulethief.cpp:59: ошибка: передача ‘const Item’ в качествеthis
аргументаdouble Item::getRatio()
отбрасываемых квалификаторов
Можете ли вы, ребята, взглянуть?
struct RatioCompare
{
bool operator()(const Item amp;i1, const Item amp;i2) const
{
double i1value= i1.getRatio();
double i2value= i2.getRatio();
return i1value < i2value;
}
};
Вот код, в котором я объявляю его, а затем проверяю, работает ли он в main…
priority_queue<Item, vector<Item>, RatioCompare > pq;
for(int i=0; i<n; i )
{
pq.push(tosteal[i]);
}
while(!pq.empty())
{
Item consider= pq.top();
cout<< "Name: "<< consider.getName()<< "Ratio "<< consider.getRatio()<<endl;
pq.pop();
}
У меня также есть как очередь, так и векторная библиотека, включенные в программу.
Комментарии:
1. Какую ошибку вы видите?
2. В функции-члене ‘bool RatioCompare::operator()(const Itemamp;, const Itemamp;) const’: joulethief.cpp:58: ошибка: передача ‘const Item’ в качестве ‘этого’ аргумента ‘double Item::getRatio()’ отбрасывает квалификаторы joulethief.cpp:59: ошибка: передача ‘const Item’ в качестве ‘этого’ аргумента ‘double Item::getRatio()’ отбрасывает квалификаторы
3. Вам нужно пометить
Item::getRatio()
какconst
квалифицированный.4. Took-Look! : С…
5. Могу ли я сделать это, поместив const после двойного getRatio() в моем конструкторе для объекта?
Ответ №1:
Функция-член Item::getRatio()
должна быть помечена как const
, иначе компилятор считает, что этот метод может изменять Item
экземпляр, что не позволяет вам использовать его, когда вы передаете указанный Item
экземпляр как a const_reference
(как вы сделали в operator()
of RatioCompare
).
Итак, просто измените определение Item::getRatio
на:
class Item {
public:
// ...
double getRatio() const; // marked as const, does not alter Item instances
};