在定义可见性方面,标准对unordered_set的Value类型有什么要求

时间:2015-11-24 14:10:14

标签: c++ c++11 language-lawyer c++-standard-library

我正在创建一个包含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

1 个答案:

答案 0 :(得分:2)

std::unordered_mapstd::unordered_set在这方面对其模板参数没有特殊要求,因此适用一般的图书馆范围规则。这是C ++ 14 17.6.4.8/2.5:

  

特别是,在以下情况下效果未定义:

     

...

     
      
  • 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,   除非特别允许该组件。
  •   

因此,如果值类型,哈希类型或谓词类型不完整(在您的情况下都是如此),则您具有未定义的行为。

由于此要点明确说明&#34;模板组件&#34; ,而该子句的其余部分引用函数,我会说这意味着一个类模板也是一个&#34;模板组件。&#34;在您的情况下,类模板在artifactSet_类定义中的SetHolder成员的定义中实例化。