当前位置: 首页 > 知识库问答 >
问题:

使std::unordered_set的嵌套类型可散列

公冶同
2023-03-14

我有一个模板结构。struct foo有嵌套类型。

template<typename Data>
struct Bar{
};

template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers> pointers;
};

我想使指针可哈希,这将适合标准::unordered_set

我在这里读到:<br>如何专门化无序容器中用户定义类型的std::hash::operator()
如何正确散列自定义结构
boost::hash_combine
模板和嵌套类/结构

并将所有知识结合到这段代码中:

namespace std {

  template <typename Dara> struct hash< typename Foo<Data>::Pointers>
  {

    size_t operator()(const typename Foo<Data>::Pointers & x) const
    {
        std::size_t seed = 0;
        boost::hash_combine(seed, x.first);
        boost::hash_combine(seed, x.second);
        return seed;
    }
  };
}

在最后一段代码中,编译器抛出一个错误:错误:模板参数未用于局部特化:Dataat the point to here: typename Data。

我尝试从模板中删除数据并这样使用:模板

我如何更正我的代码?

问候,塔尔。


共有2个答案

米浩穰
2023-03-14

我找到了更简单的解决方案:添加boost::hash:

使Foo结构如下:

template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers,boost::hash<Pointers> pointers;
};

从这里阅读:

叶国兴
2023-03-14
匿名用户

您不能专门化嵌套类型。编译器无法推断出你试图专门化的东西。您可以专门化< code>std::hash

namespace std {
    template <typename Data>
    struct hash<std::pair<Bar<Data>*,Foo<Data>*>> {
        ...
    }
}

请注意,指针通常不是好的键。您可能需要使用<code>*x。首先和*x。第二个使用<code>hash_combine()。

 类似资料:
  • 本页包含内容: 嵌套类型实例 嵌套类型的引用 枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义嵌套类型,可以在枚举类型、类和结构体中定义支持嵌套的类型。 要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。 嵌套类型实例 下面这个例子定义了一个结

  • 注意:这个问题被简单地标记为这个问题的重复,但它不是完全的重复,因为我是专门询问std::optionals的。如果你关心一般情况,还是一个很好的问题。 假设我有嵌套的选项,如下所示(愚蠢的玩具示例): 还有这个垃圾邮件功能: 什么是压扁这张可选支票的最佳方法?我做了这样的东西,它不是可变的,但我不太关心这个(如果真的需要,我可以再添加一个级别(用),而且超出这个级别的所有东西都是可怕的代码)。

  • 我有那段代码(这是从一个更大的项目中复制的最小值)。 它在gcc 9.2中失败,并出现以下错误: 在“constexpr const auto poly_gcd,myint”的实例化中 静态配置的自动val=poly_gcd_reduce_helper::val; 显然,编译器试图实例化poly_gcd_reduce_helper,void 我必须承认我现在不知道该怎么办。

  • 问题内容: 是否可以将非选择查询(更新,插入,删除)嵌入到另一个查询中? 诸如此类(select内的插入) 问题答案: 基本答案 Postgres中 有 CTE* (公用表表达式) *(就像在除MySQL外的任何主要现代RDBMS中一样)。 从9.1版开始,其中包括修改数据的CTE。这些可以“嵌套”。 更新:MySQL 8.0最终添加了CTE。 与 子查询 不同,CTE构成了优化障碍。查询计划程序

  • 前几天我问了一个关于嵌套向量的非常类似的问题,但我遇到了另一个让我难堪的问题。我需要在编译时获取嵌套向量的最内层类型,以便将其作为模板参数传递。 例如,如果我有这个嵌套向量: 我需要一种方法来提取,这样我就可以调用一个函数,它需要一个嵌套的向量,并对这样的元素工作: 除了catch之外,这个函数应该能够处理包含任何类型的任何深度的嵌套向量。当我调用时,我希望自动为我推导出内部类型。 所以也许电话看

  • 当我编译以下代码时,我看到了与哈希相关的错误。 /tmp/ccCQFQ4N.o: 在函数“标准::__detail::_Hash_code_base ,标准::矢量 然后,我介绍了下面自己的Hash,问题就解决了。 问题 1 警告:基类“结构”std::unary_function,无符号整型 问题2 非常感谢。