C++ 对友元运算符的未定义引用

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

在我的代码中,我在标题“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::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这是这个特定函数是这个类的朋友的唯一信息。它与这个函数的定义位置无关(但是,有一种特殊的语法允许您声明友谊并同时定义函数。不过,我不推荐这样做)。