Ошибка: передача 'const T' в качестве 'this' аргумента 'bool T :: operator <(T)' отбрасывает квалификаторы - PullRequest
9 голосов
/ 24 октября 2011
#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

Ответы [ 3 ]

17 голосов
/ 24 октября 2011

Оператор сравнения будет вызываться для const-ссылки экземпляра класса, поэтому он должен быть объявлен как функция-член const.

Хорошей практикой также является передача аргумента с помощью const-referenceчем по значению, хотя это не имеет большого значения для вашего простого класса:

bool operator<(const MyData & rhs) const { return m_iData < rhs.m_iData; }
//             ^^^^^^^^^^^^^^      ^^^^^
//             if you like         mandatory

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

5 голосов
/ 24 октября 2011

Значение operator< должно быть const для обоих аргументов:

    bool operator<(MyData const& rhs) const { return m_iData < rhs.m_iData; }
0 голосов
/ 24 октября 2011

Вы должны написать оператор с const операндами.Посмотрите здесь .

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