Проблема со станд.:: карта и станд.:: пара

У меня есть небольшая программа, которую я хочу выполнить для тестирования чего-то

#include <map>
#include <iostream>
using namespace std;

struct _pos{
        float xi;
        float xf;

        bool operator<(_pos& other){

                return this->xi < other.xi;
        }
};

struct _val{

        float f;
};

int main()
{
        map<_pos,_val> m;

        struct  _pos k1 = {0,10};
        struct  _pos k2 = {10,15};

        struct  _val v1 = {5.5};
        struct  _val v2 = {12.3};                                                                   

        m.insert(std::pair<_pos,_val>(k1,v1));
        m.insert(std::pair<_pos,_val>(k2,v2));

        return 0;
}

Проблема состоит в том, что, когда я пытаюсь скомпилировать его, я получаю следующую ошибку

$ g++ m2.cpp -o mtest
In file included from /usr/include/c++/4.4/bits/stl_tree.h:64,
                 from /usr/include/c++/4.4/map:60,
                 from m2.cpp:1:
/usr/include/c++/4.4/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = _pos]’:
/usr/include/c++/4.4/bits/stl_tree.h:1170:   instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = _pos, _Val = std::pair<const _pos, _val>, _KeyOfValue = std::_Select1st<std::pair<const _pos, _val> >, _Compare = std::less<_pos>, _Alloc = std::allocator<std::pair<const _pos, _val> >]’
/usr/include/c++/4.4/bits/stl_map.h:500:   instantiated from ‘std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [with _Key = _pos, _Tp = _val, _Compare = std::less<_pos>, _Alloc = std::allocator<std::pair<const _pos, _val> >]’
m2.cpp:30:   instantiated from here
/usr/include/c++/4.4/bits/stl_function.h:230: error: no match for ‘operator<’ in ‘__x < __y’
m2.cpp:9: note: candidates are: bool _pos::operator<(_pos&)
$ 

Я думал, что объявление оператора <на ключе решит проблему, но ее все еще там.

Что могло быть неправильным?

Заранее спасибо.

9
задан Soo Wei Tan 2 May 2012 в 21:07
поделиться

3 ответа

Проблема заключается в следующем:

bool operator<(_pos& other)

Должно быть следующее:

bool operator<(const _pos& other) const {
//             ^^^^               ^^^^^

Без первого const правая часть сравнение ( b в a ) не может быть const , поскольку без const функция может изменять свой аргумент.

Без второй const левая часть сравнения ( a в a ) не может быть const , поскольку без const функция может изменять this .

Внутренне ключи карты всегда const .


Следует отметить, что вы должны предпочесть использовать функции, не являющиеся членами. То есть лучше использовать бесплатную функцию:

bool operator<(const _pos& lhs, const _pos& rhs)
{
    return lhs.xi < rhs.xi;
}

В том же пространстве имен, что и ваш класс. (В нашем примере прямо под ним.)


Кстати, в C ++ нет необходимости добавлять к объявлению переменной типа структуры префикс struct . Это идеально и предпочтительно:

    _pos k1 = {0,10};
    _pos k2 = {10,15};

    _val v1 = {5.5};
    _val v2 = {12.3};

(Хотя имена ваших типов, по общему признанию, названы неортодоксальным образом.: P)


Наконец, вы должны предпочесть служебную функцию make_pair для создания пар:

    m.insert(std::make_pair(k1,v1));
    m.insert(std::make_pair(k2,v2));

Это избавляет вас от необходимости записывать типы для пары и, как правило, легче читается. (Особенно, когда появляются более длинные имена типов.)

25
ответ дан 4 December 2019 в 06:55
поделиться

Подпись оператора «меньше чем» должна быть bool operator <(const _pos & other) const , иначе карта не может использовать этот оператор в константных функциях, поскольку эта функция-член объявлена ​​как неконстантная.

4
ответ дан 4 December 2019 в 06:55
поделиться

Я думаю, что ваше определение operator <неверно - правая сторона (аргумент в данном случае) должна быть помечена как const, и это должна быть функция-член const, например

    bool operator<(const _pos& other) const{ 

            return this->xi < other.xi; 
    } 
4
ответ дан 4 December 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: