#c #class #sorting #vector
#c #класс #сортировка #вектор
Вопрос:
#include <iostream>
#include <vector>
#include <algorithm>
class MyData
{
public:
int m_iData;
bool operator<(MyData rhs) { return m_iData < rhs.m_iData; }
};
int main ()
{
std:: vector <MyData> myvector(2, MyData() );
myvector[0].m_iData=2; myvector[1].m_iData=4;
std::sort(myvector.begin(), myvector.end());
}
Попытка скомпилировать это дает:
error: passing 'const MyData' as 'this' argument of 'bool MyData::operator<(MyData)'
discards qualifiers
Комментарии:
1. Пожалуйста, измените
--
в названии наT
. Мне было трудно понять вопрос. (Я не знаю, почему у меня нет кнопки редактирования по этому вопросу, хотя …)
Ответ №1:
Оператор сравнения будет вызываться для const-ссылки экземпляра класса, поэтому он должен быть объявлен как функция-член const.
Также рекомендуется передавать аргумент по const-ссылке, а не по значению, хотя это не имеет большого значения для вашего простого класса:
bool operator<(const MyData amp; rhs) const { return m_iData < rhs.m_iData; }
// ^^^^^^^^^^^^^^ ^^^^^
// if you like mandatory
Обычно настоятельно рекомендуется объявлять все функции-члены постоянными, которые не изменяют ваш объект. Это не только сообщает о ваших намерениях и дизайне, но и в противном случае было бы невозможно использовать эти функции для постоянных объектов или ссылок.
Ответ №2:
An operator<
должно быть const
для обоих аргументов:
bool operator<(MyData constamp; rhs) const { return m_iData < rhs.m_iData; }
Комментарии:
1. Это сработало, спасибо. Хороший намек на ссылку тоже. Я об этом не подумал.
Ответ №3:
Вы должны написать оператор с const
операндами. Взгляните сюда.