具有不完整值类型的映射

map with incomplete value type

本文关键字:类型 映射      更新时间:2023-10-16

我收到以下错误:

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

错误为"字段的类型"Test"不完整"。我读了一些帖子,暗示这可能是xcode附带的libcxx版本中的一个错误,但如果我必须将其更改为:,我一点也不会感到惊讶

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:

特别是,在以下情况下,影响是不明确的:

  • 。。。

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

(明确允许不完整类型的组件只有declvalunique_ptrdefault_deleteshared_ptrweak_ptrenable_shared_from_this。)