在定义可见性方面,该标准对undreded_set的Value类型提出了哪些要求
What requirements does the standard impose on the Value type of unordered_set in terms of definition visibility
我正在创建一个包含unordered_set
的类,该类具有自己的散列和谓词,如下所示:
//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_;
};
我在ubuntu-linux(stdlibc++)下使用gcc 4.8.2编译器,并且我观察到,如果我只使用cpp文件中的unordered_set
,它只在声明ArtifactImpl
时编译。然而,我需要提供ArtifactSetKeyOps
的定义(为什么,我不明白)。
- 标准对值类型的
unordered_set
在声明unordered_set
- 这段代码应该适用于所有平台吗?此外,如果是,为什么哈希和谓词需要在声明期间可见
unordered_set
std::unordered_map
和std::unordered_set
在这方面对其模板参数没有特殊要求,因此适用库范围内的通用规则。哪个是C++14 17.6.4.8/2.5:
特别是,在以下情况下,影响是不明确的:
- 如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非该组件特别允许
因此,如果值类型、哈希类型或谓词类型不完整(在您的情况下是这样),则存在Undefined Behavior。
由于这个要点特别指出"templatecomponent",而该子句的其余部分则指函数,我认为这意味着类模板也是"模板组件"。在您的情况下,类模板在SetHolder
类的定义中的artifactSet_
成员的定义处实例化。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- std::<key-value>不同类型的对向量
- LLVM:如何在运行时跟踪非类型语言的 Value* 的数据类型?
- static_assert<std::is_floating_point<T>::value, " " ) 由于未使用的模板类型而失败
- 如何在代码块 IDE 上修复此警告,警告:按值 [-Wcatch-value=] 捕获多态类型"类 std::d omain_error"
- 什么是类型*volatile*name=value
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- 在定义可见性方面,该标准对undreded_set的Value类型提出了哪些要求
- 枚举类型value作为c++中数组的长度
- C++标准:类型"int"的矢量构造函数中的默认"const T& value"
- C++11 在map<key,value>中存储值(整数和字符串)的多种数据类型的最简单方法?
- 如何访问类型为class的vector的vector中的value