我的班级中有简单的运算符重载
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类,所以我需要全局运算符重载
答案 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)
您的代码没有意义。
operator*
内定义FOO
功能。friend
,因此您无需将该功能设为FOO
FOO
。简化您的代码。
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;
}