考虑与前面的 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()
{
}
此代码在使用 g++4.9.2 或 g++5 时无法编译,但使用 clang++3.5 编译。
g++吐出的错误以
error: invalid application of 'sizeof' to incomplete type 'Node'
: std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
问题:声明?Node
时必须是完整类型std::unordered_set
吗?在这种情况下,看起来 g++ 或 clang++ 都是错误的。
PS:我知道可以通过使用 astd::shared_ptr<Node>
来避免这种情况,但是想了解上面代码中的行为。