【问题标题】:Are pointers stored in std::set const?指针是否存储在 std::set const 中?
【发布时间】:2013-01-30 14:42:37
【问题描述】:

我正在寻找代码中的错误并且遇到了问题:

 class a
 {
 public:
 void foo(int a) {}
 }

  std::set<a*> set;
  std::set<a*>::iterator it = set.begin();

  it->foo(55); //gives me error:
  // error: request for member ‘foo’ in ‘* it.std::_Rb_tree_const_iterator<_Tp>::operator-><a*>()’, which is of pointer type ‘a* const’ (maybe you meant to use ‘->’ ?)

为什么它不允许我在上面使用非常量函数?在不使用强制转换的情况下,我可以做些什么来拥有一组非常量指针?

【问题讨论】:

  • 迭代器返回一个常量引用,因为你不能修改它引用的值(因为它被用作std::set的键)。但这不是你的问题。
  • @Sander De Dycker 是的,这不是问题所在。双重取消引用一切正常。
  • 顺便说一句:存储在std::set中的指针 const。但它们不是 指向 const 的指针。

标签: c++ stl iterator set constants


【解决方案1】:

你需要解引用两次

(*it)->foo(55);

it 是指向指针的迭代器。如果您使用的是 std::set&lt;a&gt; 而不是 std::set&lt;a*&gt;,那么您的代码将是正确的。

【讨论】:

    【解决方案2】:

    问题是您需要尊重迭代器,然后是指针。将 it-&gt;foo(55); 替换为 (*it)-&gt;foo(55); 这将起作用。

    【讨论】:

      【解决方案3】:

      你是间接的一级。

      (*it)->foo(55);
      

      有效,因为it 实际上是一个指向存储类型的指针,它本身就是一个指针。

      【讨论】:

        猜你喜欢
        • 2017-05-09
        • 1970-01-01
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多