Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g+中std::无序集编译错误的类型不完整+;5、以铿锵+的形式编译+;_C++_C++11_Clang_Incomplete Type_Gcc5 - Fatal编程技术网

C++ g+中std::无序集编译错误的类型不完整+;5、以铿锵+的形式编译+;

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

考虑与前一个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”对不完整类型“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()
{

}