重载操作符的多个定义符号



我有一个笛卡尔坐标类,我试图重载一些操作符,但是在构建时,我得到一个致命的错误,关于操作符+有多个定义的符号。

class Cartesian 
public:
int x,y;
Cartesian operator/=(const int64_t denominator)
{
return { x /= denominator, y /= denominator };
}
Cartesian operator+=(const Cartesian& c)
{
return { x += c.x, y += c.y };
}
Cartesian operator+(const Cartesian& c)
{
return { x + c.x, y + c.y };
}
friend Cartesian operator+(const Cartesian& c1, const Cartesian& c2);
};
Cartesian operator+(const Cartesian& c1, const Cartesian& c2) { return { c1.x + c2.x, c1.y + c2.y }; };
有人能帮我指出我在这里犯的错误吗?

这是同一个运算符

Cartesian operator+(const Cartesian& c)
{
return { x + c.x, y + c.y };
}
friend Cartesian operator+(const Cartesian& c1, const Cartesian& c2);

你可以有一个或另一个,但不能两者兼得。成员操作符假定它们的第一个操作数是一个封闭类。因此,两个声明将生成相同的混乱名称。一些90年代的编译器可能会忽略这一点,只有在连接阶段才会出现问题,或者如果使用了操作符根本不会显示问题,我甚至很不幸地获得了一本书,其中的示例代码包含这样的错误。

下面是重载operator+进行加法运算的工作示例,重载operator<<用于输出当前点值。你的错误是,你定义operator+两次,首先在类内,然后在外面也。相反,只需在类之外定义它,如下所示。

#include <iostream>
class Cartesian 
{
public:
//Overload operator+ for adding Cartesian instances
friend Cartesian operator+(const Cartesian& c1, const Cartesian& c2);

//Overload operator<< for printing out Cartesian's x and y values
friend std::ostream& operator<<(std::ostream& os, const Cartesian& obj);
int x,y;
void setXY(int px, int py)
{
x = px;
y = py;
}      
};
Cartesian operator+(const Cartesian& c1, const Cartesian& c2) 
{ 
return { c1.x + c2.x, c1.y + c2.y };
}
std::ostream& operator<<(std::ostream& os, const Cartesian& obj)
{
std::cout<<obj.x<<" "<<obj.y;
}
int main()
{
std::cout<<"Hello World"<<std::endl;;

Cartesian point1, point2;

point1.setXY(5,10);
std::cout<<"point1's coordinates are: "<<point1<<std::endl;

point2.setXY(15, 20);
std::cout<<"point2's coordinates are: "<<point2<<std::endl;

Cartesian resultingPoint = point1 + point2;
std::cout<<"resultingPoint's coordinates are: "<<resultingPoint<<std::endl;

return 0;
}

最新更新