我收到以下错误:
class Test
{
std::map<std::string,Test> test;
};
错误是“字段类型不完整'测试'”。我读了一些线程,建议这可能是随xcode附带的libcxx版本中的一个错误,但如果我只需将其更改为:
它就不会让我感到惊讶class Test
{
std::map<std::string,std::shared_ptr<Test>> test;
};
我只是想仔细检查这肯定是一个正确的错误而不是错误。
干杯!
答案 0 :(得分:7)
除非另有说明,否则标准要求标准库的模板组件中使用的所有类型都必须完整。因此libc ++的错误是正确的。使用不完整类型是未定义的行为(§17.6.4.8[res.on.functions] / 2),因此libstdc ++接受它也没有错。
您可以使用指针对象来构建完整类型。但是你也可以使用一些允许不完整类型的第三方集合库,例如boost::container::map
是designed to allow incomplete types。
§17.6.4.8其他职能/ 2:
特别是,在以下情况下效果未定义:
...
如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。
(明确允许不完整类型的唯一组件是declval
,unique_ptr
,default_delete
,shared_ptr
,weak_ptr
和enable_shared_from_this
。)