我收到以下错误:
class Test
{
std::map<std::string,Test> test;
};
错误是“字段的类型‘测试’不完整”。我读了一些帖子,建议这可能是 xcode 附带的 libcxx 版本中的一个错误,但如果我只需将其更改为:
class Test
{
std::map<std::string,std::shared_ptr<Test>> test;
};
我只是想仔细检查这绝对是一个正确的错误而不是一个错误。
Cheers!
标准要求,除非另有说明,标准库模板组件中使用的所有类型都必须完整。因此libc++的错误是正确的。使用不完整类型是未定义的行为(§17.6.4.8[res.on.functions]/2),因此 libstdc++ 接受它也没有错。
您可以使用指针对象来构造完整的类型,就像您所做的那样。但您也可以使用一些允许不完整类型的第三方集合库,例如boost::container::map http://www.boost.org/doc/libs/1_51_0/doc/html/boost/container/map.html is 旨在允许不完整的类型 http://www.boost.org/doc/libs/1_51_0/doc/html/container/containers_of_incomplete_types.html.
§17.6.4.8 其他功能/2:
特别是,在以下情况下效果未定义:
(明确允许不完整类型的唯一组件是declval
, unique_ptr
, default_delete
, shared_ptr
, weak_ptr
and enable_shared_from_this
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)