不完整的类型的std ::以g ++ 5 unordered_set编译错误,在铛++编译(inco

2019-10-22 04:37发布

考虑与先前的SO问题的代码C ++循环依赖混淆邻接表表示

#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()
{

}

使用克++ 4.9.2或g ++ 5时,此代码不编译,但是与铛++ 3.5编译。

通过克吐出++错误开头

error: invalid application of 'sizeof' to incomplete type 'Node' : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>

问:请问Node必须是一个完整的类型声明的时候std::unordered_set ? 看起来像要么克++或铛++是错在这种情况下。

PS:我知道这种情况可以通过使用可避免std::shared_ptr<Node>代替,但是想了解在上面的代码的行为。

Answer 1:

这是不确定的行为实例化一个标准库容器不完全类型。 [res.on.functions] / 1,2.5:

1在某些情况下(置换函数,处理函数,用于实例标准库模板组件类型的操作),C ++标准库依赖于由C ++程序提供的组件。 如果这些组件不符合他们的要求,标准对执行没有任何要求。

2特别地,效应未定义在下列情况下:

  • [...]
  • 如果一个不完整的类型(3.9)实例化一个模板组件时,除非特别允许该组件被用作模板参数。

这两种实现方式是正确的。

目前一个提案不完全类型支持添加到一些容器,但它仅限于vectorlistforward_list



文章来源: incomplete type for std::unordered_set compiling error in g++5, compiles in clang++