首页 > 解决方案 > 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")"

如何为受保护的内部类定义我的哈希函数(使用内部类的受保护成员)?

标签: c++oophashunordered-mapprotected

解决方案


我认为这就是你想要的:

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);
}

我也想问,为什么protectedprotected使派生类可以访问项目。您可能已经在简化中删除了这些,但如果没有,您想使用private.


推荐阅读