具有不完整值类型的地图

时间:2012-09-05 12:19:16

标签: c++ map c++11 std libc++

我收到以下错误:

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

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

它就不会让我感到惊讶
class Test
{
    std::map<std::string,std::shared_ptr<Test>> test;
};

我只是想仔细检查这肯定是一个正确的错误而不是错误。

干杯!

1 个答案:

答案 0 :(得分:7)

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

您可以使用指针对象来构建完整类型。但是你也可以使用一些允许不完整类型的第三方集合库,例如boost::container::mapdesigned to allow incomplete types


§17.6.4.8其他职能/ 2:

  

特别是,在以下情况下效果未定义:

     
      
  • ...

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

  •   

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