Этот хеш работает только для типов перечисления

Я работаю над (очень) простым классом в C++, который имеет unordered_map член:

class SDLFontManager : public CPObject, public FontManagerProtocol {

public:

    SDLFontManager() {};

    // flush the cache when the manager is destroyed
    virtual ~SDLFontManager() { flushFontCache(); };

    // load a font from the cache if it exists, or load it from file and cache it.
    virtual FontProtocol* fontWithTTF(const char* filename) {
        if(_cache.find(filename) != _cache.end()) {
            return _cache[filename];
        }

        SDLFont* font = new SDLFont(filename);
        _cache[filename] = font;
        font->retain();

        return font;
    }

    // flush the font cache
    virtual void
    flushFontCache() {
        for(auto font: _cache) {
            font.second->release();
        }
    }

private:

    std::unordered_map<std::string, SDLFont*> _cache;
};

Когда я компилирую, я не получаю ошибок в источнике класса, но clang терпит неудачу, указывая мне на стандартную библиотеку C++ functional файл со следующим сообщением:

functional:2441:5: Static_assert failed "This hash only works for enumeration types"

трассировка стека от Clang

Я предполагаю, что есть проблема с функцией хеширования, необходимой для unordered_map (который, если я правильно, реализован как HashMap). Когда я заменяю его простым mapвсе компилируется правильно. У меня есть другие unordered_mapв моей кодовой базе с std::string как ключи, которые прекрасно компилируются.

Есть ли какая-то очевидная ошибка, которую я не заметил? Я сильно сомневаюсь, что это будет стандартной ошибкой библиотеки.

(если это может помочь, код скомпилирован с clang-700.0.65 (Apple LLVM version 7.0.0, поставляется с Xcode 7), без исключений /RTTI, и std=c++14)

редактировать

Как указано в ответе @dau_sama, <string> не был включен напрямую (только путем включения другого заголовка), что вызывало проблему. Возможный дубликат относительно отличается, так как std::string не является пользовательским классом, и стандартная библиотека предоставляет для него хеш-функцию.

1 ответ

Решение

Возможно, вам не хватает заголовка строки

#include <string>

должен решить вашу проблему

Другие вопросы по тегам