C++ g+中std::无序集编译错误的类型不完整+;5、以铿锵+的形式编译+;
考虑与前一个SO问题相关的代码C++ g+中std::无序集编译错误的类型不完整+;5、以铿锵+的形式编译+;,c++,c++11,clang,incomplete-type,gcc5,C++,C++11,Clang,Incomplete Type,Gcc5,考虑与前一个SO问题相关的代码 #包括 #包括 类节点; 类散列{ 公众: std::size\u t操作符()(const Node&Node)const; }; 类节点{ 公众: int数据; std::无序的_集链接; }; 内联大小\u t哈希::运算符()(常量节点和节点)常量{ 返回node.data; } int main() { } 当使用g++4.9.2或g++5时,此代码不会编译,但会使用clang++3.5编译 g++抛出的错误以 错误:“sizeof”对不完整类型“No
#包括
#包括
类节点;
类散列{
公众:
std::size\u t操作符()(const Node&Node)const;
};
类节点{
公众:
int数据;
std::无序的_集链接;
};
内联大小\u t哈希::运算符()(常量节点和节点)常量{
返回node.data;
}
int main()
{
}
当使用g++4.9.2或g++5时,此代码不会编译,但会使用clang++3.5编译
g++抛出的错误以
错误:“sizeof”对不完整类型“Node”的应用无效。
:标准::对齐存储
问题:声明std::unordered\u集时节点是否必须是完整类型?在这种情况下,g++或clang++似乎都是错误的
PS:我知道使用std::shared_ptr可以避免这种情况,但是我想了解上面代码中的行为。实例化类型不完整的标准库容器是未定义的行为。[res.on.functions]/1,2.5:
1在某些情况下(替换函数、处理函数、,
对用于实例化标准库模板的类型的操作
组件),C++标准库依赖于提供的组件
通过C++程序实现。如果这些部件不符合其要求,
本标准对实施无任何要求
2特别是在以下情况下,影响未定义:
- [……]
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许
这一部分
两种实现都是正确的
目前有一种方法可以向某些容器添加不完整的类型支持,但它仅限于vector
、list
和forward\u list
hmm,clang++甚至没有发出警告,clang++-std=c++11-Wall-Wextra-Wpedantic so.cpp
\u1:我看不出任何东西对这个答案有异议。@t.c.谢谢,点击这里。我知道有一个很老的C++文章中的<代码> STD::vector < /代码>,但不知道现在标准明确禁止使用不完整的类型(除非特别允许)。@ VSoToCo不是“无处不在”,就像标准容器内容。@ MutcMnabb [Re.on,函数]适用于任何地方。
#include <cstddef>
#include <unordered_set>
class Node;
class Hash {
public:
std::size_t operator()(const Node &node) const;
};
class Node {
public:
int data;
std::unordered_set<Node, Hash> links;
};
inline size_t Hash::operator()(const Node &node) const {
return node.data;
}
int main()
{
}