错误:使用重载运算符'*'是不明确的

时间:2015-05-26 02:36:10

标签: c++ pointers vector reference

当我尝试用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]);

我已经在论坛中查找了错误并遵循了一些步骤,但我从来没有让它工作。此外,我也试图理解错误笔记中的解释,但我不能。 我真的希望有人可以帮助我。

最后,如果有人对此问题进行了否定评价,请至少解释原因。

1 个答案:

答案 0 :(得分:2)

问题是你不理解引用带来的语法。当您使用&声明引用时,您可以像使用实际变量一样使用它,而不是像指针一样,这意味着您不能在其上使用运算符*(除非它是参考在指针类型上)。使用*运算符会产生与在常规变量上使用它相同的效果。

您可以通过删除代码中的*来解决问题:

    pState[0] = statesVector[i];
    pState[1] = statesVector[i+1];
    particles[i/2].setState(pState);

如果您在operator*类中定义Vec2f并使其返回Vec2f,则代码可以按原样编译。但是,这在语义学的观点上没有意义(取消引用的值不应该给出相同类型的东西),所以这不是解决问题的方法。