2015-06-25 2 views
-1

Я пытаюсь передать перегрузку пользовательского класса в качестве компаратора std::map.Ошибка при попытке передать '==' перегрузку в std :: map compator

Вот код, и ошибка, чтобы помочь вам помочь мне:

Вот Position.hpp

#ifndef POSITION_HPP_ 
# define POSITION_HPP_ 

class Position 
{ 
public: 
    int _x; 
    int _y; 

    Position(){} 
    Position(int x, int y) 
    { 
    _x = x; 
    _y = y; 
    } 

    void setPosition(Position &newpos) 
    { 
    _x = newpos._x; 
    _y = newpos._y; 
    } 

    int getX() 
    { 
    return _x; 
    } 

    int getY() 

    return _y; 
    } 
    void setX(int x) 
    { 
    _x = x; 
    } 
    void setY(int y) 
    { 
    _y = y; 
    } 

    struct cmpIsSame{ 
    inline bool operator==(const Position& pos) 
    { 
     if (pos._x == _x && pos._y == _y) 
     return true; 
     return false; 
    } 
    }; 

    inline Position&  operator=(const Position& pos) 
    { 
    _x = pos._x; 
    _y = pos._y; 
    return *this; 
    } 
}; 

#endif 

А вот карта заявление в GameEngine.hh

private: 
    std::map<Position, Case, Position::cmpIsSame> _cases; 

И здесь приведена ошибка:

Position.hpp: In member function ‘bool Position::cmpIsSame::operator==(const Position&)’: 
Position.hpp:17:7: error: invalid use of non-static data member ‘Position::_x’ 
    int _x; 
    ^
Position.hpp:52:21: error: from this location 
     if (pos._x == _x && pos._y == _y) 
        ^
Position.hpp:18:7: error: invalid use of non-static data member ‘Position::_y’ 
    int _y; 
    ^
Position.hpp:52:37: error: from this location 
     if (pos._x == _x && pos._y == _y) 
            ^

Любая помощь будет приятной?

+0

Есть ли причина, по которой вы не хотите просто перегружать 'operator == (const Position &, const Position &)'? – TartanLlama

ответ

1

Прежде всего, вы должны использовать либо функциональный объект, либо статическую функцию. Но в любом случае ваш подход неверен, поскольку компаратор должен удовлетворять строгому принципу слабого упорядочения, который соответствует оператору <.

От стандарта C++ (23.2.4 Ассоциативные контейнеры)

3 The phrase “equivalence of keys” means the equivalence relation imposed by the comparison and not the operator== on keys. That is, two keys k1 and k2 are considered to be equivalent if for the comparison object comp, comp(k1, k2) == false && comp(k2, k1) == false. For any two keys k1 and k2 in the same container, calling comp(k1, k2) shall always return the same value.

1

Как ошибки

В осуществлении operator== попытке получить доступ к членам _x т.д. объемлющего класса , У вас нет доступа к ним. Внедрение класса в класс является проблемой пространства имен, а не проблемой доступа к членству.

Было бы проще просто предоставить бесплатную функцию или функтор, который предлагает сравнение.

Как сравнения ключей в map

Определение ключа сравнения для std::map является std::less, который по умолчанию вызывает operator<. Может быть проще просто реализовать перегруженный operator< для ключа, который вы используете.

bool operator<(const Position& lhs, const Position rhs&) { 
    // your implementation of "less" here... 
} 

Что касается реализации less

Это действительно до вас и каким образом вы используете его в приложении. Но в качестве первого приближения (также чтобы попытаться получить код вверх и вниз), рассмотрите возможность использования расстояния (pythagorean theory) от точки до начала координат (вероятно, 0,0).

Смежные вопросы