为嵌套类型定义散列模板

时间:2015-10-13 06:06:18

标签: c++ templates hash types nested

我需要为一个类型定义一个哈希函数,这取决于一个类型,它取决于一个类型。我这样累了:

我想,我需要在哈希函数中为G提供一个模板参数,否则G无法正确推导出来,因为它需要一个模板参数本身,但我收到了警告。

template <typename P>
class G;

template <typename G>
class R;

template <typename P> std::size_t hash_code(const typename R<G<P>>::rs&);




namespace std
{
    template <typename P>
    struct hash<typename R<G<P>>::rs>
    {
        size_t operator()(const typename R<G<P>>::rs& rs) const
        {
            return hash_code(rs);
        }
    };
}



// definitions

template <typename P>
class G
{

public:

    typedef P p;
    typedef G<p> THIS;
    typedef R<THIS> r;

    std::unordered_set<r> Rset;

};



template <typename G>
class R
{

public:

    typedef G g;
    typedef typename G::p rs;

};




template<typename P>
size_t hash_code(const typename R<G<P>>::rs& rs)
{
    size_t hash = 0x9e3779b9;

    // hashing

    return hash;
}

警告是:

hashtest.cpp:20:12: warning: class template partial specialization contains a template
      parameter that cannot be deduced; this partial specialization will never be used
    struct hash<typename R<G<P>>::rs>
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
hashtest.cpp:19:24: note: non-deducible template parameter 'P'
    template <typename P>

这是我想通过在哈希模板中模板化G来避免的确切问题。

2 个答案:

答案 0 :(得分:1)

R<G<P>>::rs是不可扣除的背景(由于::)。

无论如何,它会导致P不是专业化。:

template <typename P> struct hash<P>

答案 1 :(得分:0)

如果这是您的实际代码而不是手工复制粘贴:

f()

在P。

之后你错过了一个结束括号