6

我收到以下错误:

class Test
{
    std::map<std::string,Test> test;
};

错误是“字段的类型'Test'不完整”。我阅读了一些线程,建议这可能是 xcode 附带的 libcxx 版本中的一个错误,但如果我只需将其更改为:

class Test
{
    std::map<std::string,std::shared_ptr<Test>> test;
};

我只是想仔细检查这绝对是一个正确的错误,而不是一个错误。

干杯!

4

1 回答 1

9

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

您可以像以前一样使用指针对象来构造完整的类型。但是您也可以使用一些允许不完整类型的第三方集合库,例如boost::container::map旨在允许不完整类型


§17.6.4.8 其他功能/2:

特别是,在以下情况下效果是不确定的:

  • ...

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

(唯一明确允许不完整类型的组件是、declvalunique_ptrdefault_deleteshared_ptr。)weak_ptrenable_shared_from_this

于 2012-09-06T08:17:52.420 回答