5

我正在编写一个具有自己类型的 unordered_set 作为成员的类。因此,我需要为hash<Foo>. 这个特化需要在声明 Foo 之后定义。但在我看来,好像hash<Foo>在定义成员之前我已经需要专业化了unordered_set<Foo>。至少它没有编译并在那里失败。我尝试了哈希模板的前向声明,但也无法使其正常工作。

相关的代码片段是:

class Foo {
public:
    int i;
    std::unordered_set<Foo> dummy;
    Peer(std::unordered_set<Foo>);
};

namespace std {
    template<> struct hash<Foo>
    {
        size_t operator()(const Foo& f) const
        {
            return hash<int>()(f.i);
        }
    };
}

提前致谢

4

2 回答 2

8

Foo不能有类型的成员变量std::unordered_set<Foo>

您不能实例化具有不完整类型的标准库容器。基本上,除了这里不相关的几个例外,一个类类型在}终止其定义之前是不完整的。

您要么需要在容器中存储一些其他类型(可能是std::unique_ptr<Foo>.

于 2012-01-08T22:24:22.050 回答
1

您可以稍微移动声明以使其编译:

class Foo;

namespace std {
  template<> struct hash<Foo> {
    size_t operator()(const Foo& f) const;
  };
}

class Foo {
public:
  int i;
  std::unordered_set<Foo> dummy;
  Foo(std::unordered_set<Foo>);
};

namespace std {
  size_t hash<Foo>::operator()(const Foo& f) const {
    return hash<int>()(f.i);
  }
}

不过,正如詹姆斯所说,is 的声明dummy是未定义的行为。

您还需要进行平等比较;最容易添加operator==Foo.

我还建议让构造Foo函数通过 const-reference 获取参数。

于 2012-01-08T22:26:18.177 回答