c++ - C++:为嵌套的内部受保护类定义哈希函数
问题描述
我正在尝试为一个内部类编写一个散列函数,它是一个更大类的受保护成员。此外,散列函数应使用内部类的受保护成员(在本例中为字符串)。所以这就是没有散列函数的样子:
class MasterClass
{
public:
// Blah blah blah
protected:
class InternalClass
{
public:
// Blah blah blah 2
protected:
string m_Value;
};
unordered_map<InternalClass, uint> m_Example_Map;
};
由于我在 MasterClass 中的 unordered_map 中使用 InternalClass 作为键,因此我需要定义散列函数。
我正在使用以下参考资料:
但我在我的头上。我最好的猜测是这样的:
class MasterClass::InternalClass;
namespace std
{
template<> struct hash<MasterClass::InternalClass>
{
public:
size_t operator()(const MasterClass::InternalClass& i_Internal) const;
};
}
class MasterClass
{
public:
// Blah blah blah
protected:
class InternalClass
{
public:
// Blah blah blah 2
protected:
string m_Value;
};
unordered_map<InternalClass, uint> m_Example_Map;
friend struct std::hash<MasterClass::InternalClass>::operator()(const MasterClass::InternalClass& i_Name) const;
};
namespace std
{
template<> size_t hash<MasterClass::InternalClass>::operator()(const MasterClass::InternalClass& i_Internal) const
{
return(std::hash<std::string>{}(*i_Internal.m_Value);
}
}
但是,这充满了编译器错误,包括“无效的朋友声明”和“类“std::hash”的显式特化必须在其第一次使用之前(在“C:\Program Files (x86)\Microsoft Visual Studio”的第 719 行\2017\Enterprise\VC\Tools\MSVC\14.16.27023\include\type_traits")"
如何为受保护的内部类定义我的哈希函数(使用内部类的受保护成员)?
解决方案
我认为这就是你想要的:
class MasterClass
{
public:
// Blah blah blah
protected:
class InternalClass; // Forward declaration needed for friend declaration
class MyHash
{
public:
size_t operator()(const MasterClass::InternalClass& i_Internal) const;
};
class InternalClass
{
public:
// Blah blah blah 2
protected:
std::string m_Value;
friend size_t MasterClass::MyHash::operator()(const MasterClass::InternalClass& i_Internal) const; // firend to allow access to m_value
};
std::unordered_map<InternalClass, unsigned, MyHash> m_Example_Map;
};
// Implementation of hash
size_t MasterClass::MyHash::operator()(const MasterClass::InternalClass& i_Internal) const
{
return std::hash<std::string>{}(i_Internal.m_Value);
}
我也想问,为什么protected
?protected
使派生类可以访问项目。您可能已经在简化中删除了这些,但如果没有,您想使用private
.
推荐阅读
- c# - Unity C#循环一些文本而不重复它们
- javascript - 在响应式 D3 svg 上垂直居中一个圆
- anchor - AMP 页面中的锚标记重新加载整个页面
- html - 使部分对齐
- java - Java - For 循环似乎执行超过了它的终止条件
- scala - 当 Row 接受可变参数时,为什么 Scala 编译器会失败并显示“此处不允许 ': _*' 注释”?
- android - RecyclerView 交换两个适配器
- python - 只有第一个线程正在使用 python 线程运行
- excel - Excel - 用特定数字替换特定字母的简单公式
- android - 如何在 Recyclerview 中将项目居中?