如何使用unordered_map,其中值类型是它所在的类?

Mar*_*tin 9 c++

这段代码:

class Foo {
    std::unordered_map<std::string, Foo> x;
};
Run Code Online (Sandbox Code Playgroud)

给我一个错误:

/usr/include/c++/4.7/bits/stl_pair.h:94:11:
  error: 'std::pair<_T1, _T2>::second' has incomplete type
foo.cpp:4:7: error: forward declaration of 'class Foo'
Run Code Online (Sandbox Code Playgroud)

但是,这段代码编译得很好:

class Foo {
    std::vector<Foo> x;
};
Run Code Online (Sandbox Code Playgroud)

这是库/编译器错误吗?

Ben*_*igt 16

C++标准为各种智能指针指定允许模板参数为不完整类型.

容器类型未提供此信息.因为它未指定,所以允许实现接受一个容器类模板的不完整类型而不是另一个容器类模板,并且仍然符合要求.

要使代码可移植,请避免在类型完成之前创建任何类型的容器.

形式上,此约束可在以下适用于您的代码的规则(17.6.4.8)中找到:

在某些情况下(替换函数,处理函数,用于实例化标准库模板组件的类型的操作),C++标准库依赖于C++程序提供的组件.如果这些组件不符合要求,则标准对实施没有要求.

特别是,在以下情况下,效果未定义:

...

  • 如果在实例化模板组件时将不完整类型用作模板参数,除非特别允许该组件.