我正在创建一个包含Class2
的类,其中包含自己的哈希和谓词,如下所示:
unordered_set
我在 ubuntu linux(stdlibc ++)下使用 gcc 4.8.2编译器,我发现它仅在声明{时才编译{1}}如果我只使用cpp文件中的//SetHolder.h
#include <unordered_set>
struct SetHolder
{
SetHolder(); //Defined in SetHolder.cpp
~SetHolder(); //Defined in SetHolder.cpp
struct ArtifactImpl; //Defined in SetHolder.cpp
struct ArtifactSetKeyOps
{
std::size_t operator()(
const ArtifactImpl& artifact) const noexcept;
bool operator()(
const ArtifactImpl& lhs, const ArtifactImpl& rhs) const;
};
std::unordered_set<ArtifactImpl,
ArtifactSetKeyOps,ArtifactSetKeyOps> artifactSet_;
};
。但是,我需要提供ArtifactImpl
的定义(为什么,我不明白)。
unordered_set
在定义时的可见度方面
声明ArtifactSetKeyOps
?unordered_set
?答案 0 :(得分:2)
std::unordered_map
和std::unordered_set
在这方面对其模板参数没有特殊要求,因此适用一般的图书馆范围规则。这是C ++ 14 17.6.4.8/2.5:
特别是,在以下情况下效果未定义:
...
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数, 除非特别允许该组件。
因此,如果值类型,哈希类型或谓词类型不完整(在您的情况下都是如此),则您具有未定义的行为。
由于此要点明确说明&#34;模板组件&#34; ,而该子句的其余部分引用函数,我会说这意味着一个类模板也是一个&#34;模板组件。&#34;在您的情况下,类模板在artifactSet_
类定义中的SetHolder
成员的定义中实例化。