【问题标题】:call function on iterator在迭代器上调用函数
【发布时间】:2017-05-04 23:00:57
【问题描述】:

我有一个“Ray”对象的 std::list,我想对其进行迭代。

for (std::list<Ray>::const_iterator it = clRay.begin(), end = clRay.end(); it != end; ++it) {
    *it->setDir( m_v3Position - *it->getOrigin() )
}

Ray 对象有 setDir() 和 getOrigin() 方法:

const QVector3D &getOrigin() const {
    return m_v3Origin;
}

void setDir( const QVector3D   &dir )
{
    m_v3Dir = dir;
}

setdir() 对编译器来说没问题,但是我不能调用getOrigin()。因为那时我得到了错误:

src/AreaLight.cpp: In member function ‘virtual void AreaLight::shadowFeeler(std::__cxx11::list<Ray>&, double&, ColorType&) const’:
src/AreaLight.cpp:18:17: error: no match for ‘operator*’ (operand type is ‘const QVector3D’)

我认为这是一个 const 问题,但我不知道如何解决。

【问题讨论】:

  • *it-&gt;setDir( m_v3Position - *it-&gt;getOrigin() ) -> it-&gt;setDir( m_v3Position - it-&gt;getOrigin() )
  • 或范围:for (auto&amp; r : clRay) { r.setDir( m_v3Position - r.getOrigin() ); }
  • 如果我使用 it-&gt;setDir( m_v3Position - it-&gt;getOrigin() ) 我收到错误 src/AreaLight.cpp:18:47: error: passing ‘const Ray’ as ‘this’ argument discards qualifiers [-fpermissive]
  • 如果你继续使用iterator,你不应该使用const_iterator
  • 在编写代码时,您应该了解自己在做什么,而不是随意尝试。显然,您使用的是const_iterator 并调用了setDir,这不是一个没有多大意义的常量函数。

标签: c++ iterator constants const-correctness


【解决方案1】:

你写了*it-&gt;。你应该只写it-&gt;。这里只有一层间接性。

这会影响两个调用。

事实上,对setDir 的调用因另一个原因而中断,即它不是const,而您正试图通过const_iterator 访问它。添加* 并不能解决该问题;它只是用一个新问题掩盖了它。随意添加更多*s,而不理解它们的含义,也不是要走的路。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2021-02-07
    • 2022-01-05
    • 2020-09-14
    • 1970-01-01
    • 2018-01-19
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多