c++ - 如何使用友元函数在模板类之外重载运算符==?

标签 c++ templates overloading operator-keyword friend

我正在尝试编写一个重载operator== 的模板类。我知道如何在类里面得到它:

    template <typename T>
    class Point
    {
    private:
        T x;
    public:
        Point(T X) : x(X) {}

        bool operator== (Point &cP)
        {
            return (cP.x == x);
        }
    };

但是现在我想在模板类之外实现这个。我读过这篇文章: error when trying to overload << operator and using friend function并在我的代码中添加模板声明:

template <typename> class Point;
template <typename T> bool operator== (Point<T>, Point<T>);
template <class T>
class Point
{
private:
    T x;
public:
    Point(T X) : x(X) {}

    friend bool operator== (Point cP1, Point cP2);
};

template <class T>
bool operator== (Point<T> cP1, Point<T> cP2)
{
    return (cP1.x == cP2.x)
}

但是我仍然收到错误:unresolved external symbol "bool __cdecl operator==(class Point<int>,class Point<int>)" (??8@YA_NV?$Point@H@@0@Z) referenced in function _main

当我从 :

带走 friend

friend bool operator== (Point cP1, Point cP2);

并希望它是成员函数,会出现另一个错误:

too many parameters for this function

为什么?

最佳答案

@Kühl 的回答是声明模板化类的模板化友元函数的最宽松方法。然而,这种方法有一个不明显的副作用:Point 的所有模板实例化。与 operator==() 的所有模板实例都是 friend .另一种方法是仅使用相同类型的 Point 进行实例化。一个 friend 。这是通过添加 <T> 来完成的在operator==()的好友声明中.

template <typename T> class Point;

template <typename S>
bool operator== (Point<S>, Point<S>);

template <typename T>
class Point {
    // ...
    friend bool operator==<T> (Point, Point);
};

引用资料
http://web.mst.edu/~nmjxv3/articles/templates.html

关于c++ - 如何使用友元函数在模板类之外重载运算符==?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58095077/

相关文章:

c++ - Matrix<M,N,type> C++ 矩阵乘法模板

c++ - 是否有适用于 C++ 的 OneDrive API?

c++ - assert 和 static_assert 有什么区别?

c++ - 如何允许模板仿函数同时作用于成员函数和非成员函数

没有重载或泛型的 C# 多参数类型

c++ - 函数重载与函数变量初始化

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 是否有任何工具/方法可以从 C++ 代码中检测/删除所有未使用的变量、宏、 header (包含)和函数?

C++ 查找实例化模板