C++ 对友元运算符的未定义引用
在我的代码中,我在标题“Geometry.h”中声明了两个类,C++ 对友元运算符的未定义引用,c++,friend,undefined-reference,C++,Friend,Undefined Reference,在我的代码中,我在标题“Geometry.h”中声明了两个类,Vector&Point。在Point类中,我有以下几点: class Point { // other stuff friend Vector operator-(const Point& lhs, const Point& rhs); } Vector在“Vector.cpp”中定义,Point在“Point.cpp”中定义 我的编译器(GCC)对此表示不满,我不知道原因: 对“Geometry::ope
Vector
&Point
。在Point
类中,我有以下几点:
class Point {
// other stuff
friend Vector operator-(const Point& lhs, const Point& rhs);
}
Vector
在“Vector.cpp”中定义,Point
在“Point.cpp”中定义
我的编译器(GCC)对此表示不满,我不知道原因:
对“Geometry::operator-(Geometry::Point const&,Geometry::Point const&)”的未定义引用|
“Point.cpp”中函数的定义如下所示:
Vector operator-(const Point& lhs,
const Point& rhs)
{
return Vector(lhs.GetX()-rhs.GetX(),lhs.GetY()-rhs.GetY());
}
正如您在讨论中发现的,您应该将
运算符-
代码放在您的命名空间中:
namespace Geometry
{
...
Vector operator-(const Point& lhs, const Point& rhs)
{
return Vector(lhs.GetX()-rhs.GetX(),lhs.GetY()-rhs.GetY());
}
}
Vector Geometry::operator-(const Point& lhs, const Point& rhs)
{
return Vector(lhs.GetX()-rhs.GetX(),lhs.GetY()-rhs.GetY());
}
有另一种方法可以将其放入命名空间中:
namespace Geometry
{
...
Vector operator-(const Point& lhs, const Point& rhs)
{
return Vector(lhs.GetX()-rhs.GetX(),lhs.GetY()-rhs.GetY());
}
}
Vector Geometry::operator-(const Point& lhs, const Point& rhs)
{
return Vector(lhs.GetX()-rhs.GetX(),lhs.GetY()-rhs.GetY());
}
在cpp文件的开头,我有“using Geometry::Point;using Geometry::Vector”;这对于友元函数来说没问题,或者这可能是它无法编译的原因吗?@AlexanderBily aschepler询问了操作符的定义,即您问题中的最后一个代码块。它应该在
几何体
命名空间(即命名空间几何体{Vector operator-(const Point&…}
)中。因此类中声明的友元运算符不属于该类作用域?感谢您的帮助,我更改了它,以便所有内容都在命名空间中定义,而不是“使用”它是有效的。@AlexanderBily这是这个特定函数是这个类的朋友的唯一信息。它与这个函数的定义位置无关(但是,有一种特殊的语法允许您声明友谊并同时定义函数。不过,我不推荐这样做)。