具有不完整值类型的地图

Joe*_*Joe 6 c++ std map c++11 libc++

我收到以下错误:

class Test
{
    std::map<std::string,Test> test;
};
Run Code Online (Sandbox Code Playgroud)

错误是"字段具有不完整类型'测试'".我读了一些线程,建议这可能是随xcode附带的libcxx版本中的一个错误,但如果我只需将其更改为:它就不会让我感到惊讶:

class Test
{
    std::map<std::string,std::shared_ptr<Test>> test;
};
Run Code Online (Sandbox Code Playgroud)

我只想仔细检查这肯定是一个正确的错误,而不是一个错误.

干杯!

ken*_*ytm 8

除非另有说明,否则该标准要求标准库的模板组件中使用的所有类型都必须完整.因此libc ++的错误是正确的.使用不完整类型是未定义的行为(§17.6.4.8[res.on.functions]/2),因此libstdc ++接受它也没有错.

您可以使用指针对象来构建完整类型.但你也可以使用一些第三方的集合库,允许不完全类型,例如,boost::container::map设计为允许不完全类型.


§17.6.4.8其他功能/ 2:

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

  • ...

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

(即明确地允许不完全类型的唯一部件是declval,unique_ptr,default_delete,shared_ptr,weak_ptrenable_shared_from_this.)

  • 注意[N4510](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4510.html)(于2015-05年采用)要求使用“ std :: vector”,“ std: :list`和`std :: forward_list`以支持不完整的值类型。为避免破坏ABI,建议中并未包含所有容器。在将来的C ++版本中(可能在C ++ 17之后),对关联容器的要求可能类似。 (3认同)