当我尝试用c ++编译这个源时:
void ParticleSystem::setState(std::vector<Vec2f>& statesVector)
{
std::vector<Vec2f> pState(2);
for (int i = 0; i < 2*np; i += 2) {
pState[0] = *statesVector[i];
pState[1] = *(statesVector[i+1]);
(*particles[i/2]).setState(pState);
}
}
我收到以下错误:
ParticleSystem.cpp:110:15: error: use of overloaded operator '*' is ambiguous (operand type
'value_type' (aka 'gfx::TVec2<float>'))
pState[0] = *statesVector[i];
^~~~~~~~~~~~~~~~
ParticleSystem.cpp:110:15: note: built-in candidate operator*(float *)
ParticleSystem.cpp:110:15: note: built-in candidate operator*(const float *)
ParticleSystem.cpp:111:15: error: use of overloaded operator '*' is ambiguous (operand type
'value_type' (aka 'gfx::TVec2<float>'))
pState[1] = *(statesVector[i+1]);
我已经在论坛中查找了错误并遵循了一些步骤,但我从来没有让它工作。此外,我也试图理解错误笔记中的解释,但我不能。 我真的希望有人可以帮助我。
最后,如果有人对此问题进行了否定评价,请至少解释原因。
答案 0 :(得分:2)
问题是你不理解引用带来的语法。当您使用&
声明引用时,您可以像使用实际变量一样使用它,而不是像指针一样,这意味着您不能在其上使用运算符*
(除非它是参考在指针类型上)。使用*
运算符会产生与在常规变量上使用它相同的效果。
您可以通过删除代码中的*
来解决问题:
pState[0] = statesVector[i];
pState[1] = statesVector[i+1];
particles[i/2].setState(pState);
如果您在operator*
类中定义Vec2f
并使其返回Vec2f
,则代码可以按原样编译。但是,这在语义学的观点上没有意义(取消引用的值不应该给出相同类型的东西),所以这不是解决问题的方法。