【问题标题】:Access member of a iterator of a vector of unique_ptrunique_ptr 向量的迭代器的访问成员
【发布时间】:2016-07-08 15:38:34
【问题描述】:

我有一个向量:

std::vector<std::unique_ptr<MyAbstract>> myList;

我想循环访问成员“id”并删除特定项目:

for (auto it = myList.begin(); it != myList.end();)
{
    if (it->id == 2)
    {
        it = myList.erase(it);
        break;
    }
    else
        ++it;
}

这一行……​​

if (it->id == 2)

给我一​​个错误:

'class std::unique_ptr' 没有名为 'id' 的成员

这似乎有效:

if (it->get()->id == 2)

不知道为什么?!这是完整的代码: http://ideone.com/kFohfA

【问题讨论】:

    标签: c++ c++11 stdvector unique-ptr


    【解决方案1】:

    it 是一个迭代器,因此it-&gt; 尝试访问存储在向量(std::unique_ptr&lt;MyAbstract&gt;) 中的类型的成员,而不是MyAbstract std::unique_ptr 持有。您需要做的是取消引用迭代器以获取底层std::unique_ptr&lt;MyAbstract&gt;,然后您可以使用-&gt; 访问MyAbstract 的成员

    (*it)->id
    

    【讨论】:

    • 谢谢,我知道这是因为底层类型,但我认为 -> 会神奇地指向 unique_ptr 中的 MyAbstract,所以我不必使用 get()。
    • @DoubleVoid 如果这样做,您将无法轻松访问std::unique_ptr 的成员。
    【解决方案2】:

    *it 的类型为std::unique_ptr&lt;MyAbstract&gt;,当然它没有名为id 的成员。

    所以你必须通过get ()获得它的“价值”:

    it->get()->id
    

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 2011-08-28
      • 2012-03-19
      • 2016-08-25
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 2014-04-29
      • 2015-06-16
      相关资源
      最近更新 更多