如何在模板类中具有静态函数? 我对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];
}