Этот хеш работает только для типов перечисления
Я работаю над (очень) простым классом в 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"
Я предполагаю, что есть проблема с функцией хеширования, необходимой для 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>
должен решить вашу проблему