在std::unordered_map中使用模板化的键

4
我不明白为什么我的编译器不接受下面的代码。
#include <unordered_set>
#include <unordered_map>

template<class T>
using M = std::unordered_set<T>;

template<class T>
using D = M<T>;

template<class T>
using DM = std::unordered_map < typename M<T>::const_iterator    // Problem
                              , typename D<T>::const_iterator >; // Problem

int main(int argc, char ** argv)
{
    D<int> d;
    M<int> m;
    DM<int> dm; // Problem
}

编译器命令是:
clang++ -std=c++14 test.cpp -o test

编译器错误信息摘录如下:

/usr/bin/../lib/gcc/x86_64-linux-gnu/5.3.1/../../../../include/c++/5.3.1/bits/hashtable_policy.h:85:11: error: 
      implicit instantiation of undefined template
      'std::hash<std::__detail::_Node_const_iterator<int, true, false> >'
        noexcept(declval<const _Hash&>()(declval<const _Key&>()))>

为什么不允许在std::unordered_map中使用typename M::const_iterator作为键?

此外,我认为这些 typename 不是必需的,因为 MD 都不是模板参数。 - Zereges
1个回答

5
因为 std::unordered_map 的哈希默认模板参数是 std::hash,但它没有提供迭代器的实现。
你需要提供自定义的哈希函数,例如:
struct iterator_hash {
    template <typename I>
    std::size_t operator()(const I &i) const {
        return std::hash<int>()(*i); // or return sth based on i
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接