std :: map<>的自定义键

时间:2015-08-05 18:15:02

标签: c++ struct key stdmap

我正在尝试使用以下struct作为std::map的自定义键:

struct ActionId {
        // ENCAPSULATED MEMBERS
    private:
        size_t _id;
        static size_t _root;
        static size_t incrementedRoot() {
            return (_root += 1);
        }

        // INTERFACE
    public:
        ActionId() :
            _id(incrementedRoot()) { }
        ActionId(const ActionId& that) :
            _id(that._id) { }
        ActionId& operator=(const ActionId& that) {
            this->_id = that._id;
            return *this;
        }
        bool operator==(const ActionId& that) const {
            return this->_id == that._id;
        }
        bool operator!=(const ActionId& that) const {
            return this->_id != that._id;
        }
        bool operator<(const ActionId& that) const {
            return this->_id < that._id;
        } 
};

以下字典是单独的InputManager类的成员:

std::map<ActionId, std::set<sf::Keyboard::Key>> _keyBindings;

在此成员函数中访问:

std::set<sf::Keyboard::Key> InputManager::keysBoundTo(ActionId action) const {
    return _keyBindings[action];
}

不幸的是,该函数抛出了这个编译错误:

  

错误C2678:二进制'[':找不到运算符,它接受类型为“const std::map<Game2D::ActionId,std::set<sf::Keyboard::Key,std::less<_Kty>,std::allocator<_Kty>>,std::less<Game2D::ActionId>,std::allocator<std::pair<const Game2D::ActionId,_Ty>>>”的左手操作数(或者没有可接受的转换)

根据this article,具有operator<()资格的ActionId const成员应足以使其成为自定义地图密钥,而this article则表示我只需要ActionId可复制和可分配。显然,我的结构符合这两个标准,那么为什么不InputManager::keysBoundTo()编译?

1 个答案:

答案 0 :(得分:1)

索引运算符(“[]”)是std :: map的非const成员函数。然而,您已明确指出keysBoundTo是const成员。

keysBoundTo重写为

std::set<sf::Keyboard::Key> InputManager::keysBoundTo(ActionId action) const
{
    auto it = keyBindigs_.find(action);
    if ( it == keyBindings_.end() )
        return std::set<sf::Keyboard::Key>();
    else
        return it->second;
}

请注意,我将您的成员变量重命名为具有尾随下划线。不要使用带有前导下划线的标识符。