Ошибка: передача ‘const T’ в качестве ‘этого’ аргумента ‘bool T:: operator<(T)' отбрасывает квалификаторы

#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 операндами. Взгляните сюда.