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

error: use of overloaded operator '*' is ambiguous

本文关键字:不明确 重载 运算符 错误      更新时间:2023-10-16

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

我已经在论坛上找到了错误,并遵循了一些步骤,但我从未让它发挥作用。此外,我也试图理解错误注释中的解释,但我做不到。我真的希望有人能帮助我。

最后,如果有人对这个问题持否定态度,请至少解释一下原因。

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

您可以通过删除代码中的*来解决问题,如下所示:

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

如果在Vec2f类中定义operator*并使其返回Vec2f,则代码可以按原样编译。然而,从语义的角度来看,这没有什么意义(去引用的值不应该给出相同类型的值(,所以这不是解决问题的方法。