std::unordered_set<Foo> 作为 Foo 类的成员
std::unordered_set<Foo> as member of class Foo
我正在编写一个类,该类有一个自己类型的unsodered_set作为成员。因此,我需要为hash<Foo>
编写一个专门化。这种专门化需要在Foo声明之后进行定义。但在我看来,在定义成员unordered_set<Foo>
之前,我似乎已经需要对hash<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);
}
};
}
提前感谢
Foo
不能有std::unordered_set<Foo>
类型的成员变量。
不能实例化类型不完整的标准库容器。基本上,除了几个与此无关的例外,类类型直到}
终止其定义时才算完整。
您要么需要在容器中存储一些其他类型(可能是std::unique_ptr<Foo>
),要么使用一个容器库,该库提供了可实例化的不完整类型的容器(例如,Boost有这样一个容器图书馆)。
您可以将声明移动一点以使其编译:
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);
}
}
然而,正如James所说,dummy
的声明是未定义的行为。
您还需要进行平等比较;最容易将CCD_ 9添加到CCD_。
我还建议Foo
的构造函数通过const引用来接受参数。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将Ref对象作为类成员
- 虚拟决赛作为安全
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 使用指向成员的指针将成员函数作为参数传递
- 我应该使用什么来代替void作为变体中的替代类型之一
- 何时提供默认参数作为模板参数
- 如何将 I->getType() 作为参数传递给 llvm 中的 CreateCall?
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- C++匿名结构作为std::映射值
- C++:如何使函数只返回作为列表一部分的字符串
- 如何制作一个将函数作为参数的类方法
- 如何在C++中使用非静态成员函数作为回调函数
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- 作为参数的"new Foo()"和"&Foo()"之间的区别
- std::unordered_set<Foo> 作为 Foo 类的成员
- std::vector<Bar> 作为类 Foo 中的成员变量需要一个空的构造函数
- 修复错误:将'const foo'作为'const size_t foo::method()'的参数传递'this'