c ++使用" *" operator no operator匹配这些操作数

时间:2016-09-19 05:26:17

标签: c++ operator-overloading

我的班级中有简单的运算符重载

class Vec2
{
public:
    Vec2(float x1,float y1)
    {
       x = x1;
       y = y1;
    }
    float x;
    float y;
};

class FOO {
private:
    friend Vec2 operator*(const Vec2 &point1, const Vec2 &point2)
    {
            return Vec2(point1.x * point2.x, point1.y * point2.y);
    }

    Vec2 mul(Vec2 p);
};

Vec2 FOO::mul(Vec2 p)
{
    Vec2 point = p * Vec2(1,-1);
    return point;
}

但是这个乘法给了我这个错误:

  

operator*没有运算符匹配这些操作数

问题是我无法更改Vec2类,所以我需要全局运算符重载

2 个答案:

答案 0 :(得分:3)

operator*定义不应位于class FOO内。把它放在任何类定义之外:

inline Vec2 operator*(const Vec2 &point1, const Vec2 &point2)
{
    return Vec2(point1.x * point2.x, point1.y * point2.y);
}

如果这是在头文件中,则需要inline关键字。然后,您可以在FOO和其他任何地方使用运算符。

不能将运算符限制为仅在FOO方法中使用。功能可见性不起作用。您可以做的最接近的事情是只在某些operator*文件中声明.cpp重载,该文件也具有使用点,并将其标记为static或匿名命名空间。

答案 1 :(得分:0)

您的代码没有意义。

  1. 您无需在operator*内定义FOO功能。
  2. 由于该功能甚至不使用friend,因此您无需将该功能设为FOO FOO
  3. 简化您的代码。

    class Vec2
    {
       public:
          Vec2(float x1 ,float y1)
          {
             x = x1;
             y = y1;
          }
          float x;
          float y;
    
    };
    
    // This does not need to be defined inside FOO.
    Vec2 operator*(const Vec2 &point1, const Vec2 &point2)
    {
       return Vec2(point1.x * point2.x, point1.y * point2.y);
    }
    
    class FOO {
       private:
          // No need for the friend declaration.
          Vec2 mul(Vec2 p);
    };    
    
    Vec2 FOO::mul(Vec2 p)
    {    
       // Works fine without the friend declaration.
       Vec2 point = p * Vec2(1,-1);
       return point;
    }