我发现了一个错误有以下:
class Test
{
std::map<std::string,Test> test;
};
错误是“字段有不完全类型‘测试’”。 我阅读建议,这可能是在libcxx的版本中的错误附带的Xcode的几个线程,但它如果我只是将它更改为不我都感到惊讶:
class Test
{
std::map<std::string,std::shared_ptr<Test>> test;
};
我只是想仔细检查,这绝对是一个正确的错误,而不是一个错误。
干杯!
该标准要求,在标准库的模板组件中使用的所有类型必须是完整的,除非另有说明。 因此libc的++的错误是正确的。 使用不完整类型是未定义的行为(§17.6.4.8[res.on.functions] / 2),所以的libstdc ++接受它是没有错任一。
你可以使用一个指针对象像你一样来构建完整的类型。 但你也可以使用一些第三方的集合库,它允许不完整的类型,例如boost::container::map
被设计为允许不完全类型 。
§17.6.4.8其它功能/ 2:
特别是,结果是不确定的下列情况:
(即明确地允许不完整的类型是唯一的组分declval
, unique_ptr
, default_delete
, shared_ptr
, weak_ptr
和enable_shared_from_this
。)