【发布时间】: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->setDir( m_v3Position - *it->getOrigin() )->it->setDir( m_v3Position - it->getOrigin() ) -
或范围:
for (auto& r : clRay) { r.setDir( m_v3Position - r.getOrigin() ); } -
如果我使用
it->setDir( m_v3Position - it->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