此哈希仅适用于枚举类型

时间:2015-08-20 14:50:48

标签: c++ xcode stl clang unordered-map

我正在使用unordered_map成员的C ++中非常简单的类:

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"

stack trace from Clang

我认为unordered_map所需的散列函数存在问题(如果我是正确的,则实现为HashMap)。当我用简单的map替换它时,一切都正确编译。我的代码库中有其他unordered_mapstd::string作为完全编译的键。

我有没有发现一些明显的错误?我非常怀疑这将是一个标准的库错误。

(如果有任何帮助,代码编译时使用clang-700.0.65Apple LLVM version 7.0.0,Xcode 7附带),无异常/ RTTI和std=c++14

修改

正如@ dau_sama的回答所指出的,<string>并未直接包含(仅包括另一个标题),这导致了问题。可能的重复是相对不同的,因为std::string不是自定义类,标准库为它提供哈希函数。

1 个答案:

答案 0 :(得分:0)

您可能缺少字符串标题

#include <string>

应解决您的问题