如何在模板类中使用静态函数?

时间:2016-03-08 07:05:22

标签: c++ templates

我对C ++不是很了解,但是我试图创建一个可以扩展为创建一种动态枚举的通用基类。可能有更好的方法来做到这一点,我可以接受建议,但我的主要问题是为什么我收到错误C2338 The C++ Standard doesn't provide a hash for this type

基本枚举模板类

template <typename T>
class Enums
{
public:
    BOOL HasValue(T enumValue) const
    {
        auto it = this->m_EnumPairs.find(enumValue);
        return (it != this->m_EnumPairs.end());
    }

    const DWORD Count() const
    {
        return this->m_EnumPairs.size();
    }

    const DWORD &operator[](T enumValue) const
    {
        auto it = this->m_EnumPairs.find(enumValue);
        if (it == this->m_EnumPairs.end())
            return 0;

        return it->second;
    }

    const DWORD GetVersionCode() const
    {
        return this->m_VersionCode;
    }

    static const DWORD Count(DWORD versionCode)
    {
        T derived(versionCode);
        return derived.Count();
    }

protected:
    DWORD m_VersionCode;

    Enums(DWORD versionCode) : m_VersionCode(versionCode), m_NextValue(0) { }
    virtual ~Enums() { }

    void Add(T enumValue)
    {
        for (auto it = this->m_EnumPairs.cbegin(); it != this->m_EnumPairs.cend(); it++)
        {
            if (it->first == enumValue)
                throw std::exception("Enum key already defined");
            if (it->second == this->m_NextValue)
                throw std::exception("Enum value already exists");
        }

        this->m_EnumPairs[enumValue] = this->m_NextValue++;
    }
    void Add(T enumValue, DWORD value)
    {
        this->m_NextValue = value;
        this->Add(valueName);
    }

private:
    std::unordered_map<T, DWORD> m_EnumPairs;
    DWORD m_NextValue;
};

派生的枚举.h

namespace Test
{
    typedef enum _Enum
    {
        EnumValue1,
        EnumValue2,
        EnumValue3,
        EnumValue4,
        EnumValue5,
        EnumValue6,
        EnumValue7,
        EnumValue8
    } Enum;
}

class DerivedEnum : public Enums<Test::Enum>
{
public:
    DerivedEnum(DWORD versionCode);
    ~DerivedEnum();
};

派生的枚举.cpp

DerivedEnum::DerivedEnum(DWORD versionCode) : Enums(versionCode)
{
    this->Add(Test::EnumValue1);
    this->Add(Test::EnumValue2);
    this->Add(Test::EnumValue3);
    this->Add(Test::EnumValue4);
    this->Add(Test::EnumValue5);
    this->Add(Test::EnumValue6);
    if (versionCode > 200)
        this->Add(Blocks::EnumValue7);
    this->Add(Blocks::EnumValue8);
}

DerivedEnum::~DerivedEnum()
{
}

用法

Enums<DerivedEnum>::Count(250)

我知道我做错了什么,我只是想知道自己做错了什么以及如何做Enums<DerivedEnum>::Count(250)之类的事情。错误集中在静态Count函数周围,当我删除静态函数并调用它时,错误完全消失。

修改

回答评论中提出的问题:使用这个问题是为了获得&#34; enum&#34;中的条目大小或数量。例如,如果我需要从文件中读取结构,并且在该结构中是一个项目数组:

struct DataFromFile
{
    int flags;
    int array[SIZE_OF_ENUM];
}

如果我的这个文件的不同版本在数组中包含不同数量的项目,我可以使用&#34; enum&#34; class,用于根据Enums<DerivedEnum>::Count(250)确定要读取的字节数。如果这没有意义,我会尝试进一步澄清。

更新

正如ZDF在评论中所说,将unordered_map更改为map可以解决问题。 unordered_map需要hash函数,默认情况下不知道如何散列我的自定义类,map不需要哈希值,因此在这种情况下效果很好。

0 个答案:

没有答案