Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在模板类中具有静态函数? 我对C++很不擅长,但是我正在尝试创建一个通用基类,可以扩展到创建一种动态枚举。可能有更好的方法来做这件事,我对建议很开放,但我的主要问题是为什么我得到了错误 C23 38。C++标准不为这个类型< /C> >提供一个哈希。_C++_Templates - Fatal编程技术网

如何在模板类中具有静态函数? 我对C++很不擅长,但是我正在尝试创建一个通用基类,可以扩展到创建一种动态枚举。可能有更好的方法来做这件事,我对建议很开放,但我的主要问题是为什么我得到了错误 C23 38。C++标准不为这个类型< /C> >提供一个哈希。

如何在模板类中具有静态函数? 我对C++很不擅长,但是我正在尝试创建一个通用基类,可以扩展到创建一种动态枚举。可能有更好的方法来做这件事,我对建议很开放,但我的主要问题是为什么我得到了错误 C23 38。C++标准不为这个类型< /C> >提供一个哈希。,c++,templates,C++,Templates,基本枚举模板类 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 {

基本枚举模板类

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;
};
用法

Enums<DerivedEnum>::Count(250)
如果此文件的不同版本在数组中包含不同数量的项,我可以使用“enum”类根据
Enums::Count(250)
确定要读取的字节数。如果这不合理,我将尝试进一步澄清

更新


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

只是一个小问题,与函数返回常量值的用法无关:它毫无用处。返回常量引用是有意义的,返回常量值则没有意义。如果函数的用户希望将值赋给常量变量,那么没关系,您不必返回常量,函数的用户将其赋给非常量变量会有问题。至于您的问题,您能否向我们展示有关如何使用静态函数的更多详细信息?你在哪里使用它?你如何使用它?你从哪里叫它?您显示的错误消息,这就是编译器告诉您的,它是完整的?从您的错误消息来看,您使用的模板的类型是不可散列的。将无序映射更改为std::map,然后查看它是否有效。顺便说一下,您可能希望阅读更多关于和的信息,并了解它们之间的关系。。检查模板参数。
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)
struct DataFromFile
{
    int flags;
    int array[SIZE_OF_ENUM];
}