Я пытаюсь написать функцию ha sh для внутреннего класса, который является защищенным членом более крупного класса. Кроме того, функция ha sh должна использовать защищенные члены внутреннего класса (в данном случае, строку). Вот как это выглядит без функции ha sh:
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;
};
Поскольку я использую InternalClass в качестве ключа в unordered_map в MasterClass, мне нужно определить функцию ha sh.
Я использую следующие ссылки:
Но я над головой. Моя лучшая догадка примерно такая:
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 :: ha sh »должна предшествовать его первое использование (в строке 719 "C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Enterprise \ VC \ Tools \ MSVC \ 14.16.27023 \ include \ type_traits") "
Как я могу определить свою функцию ha sh для защищенного внутреннего класса (используя защищенные члены внутреннего класса)?