gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:32 26 4
gpt4 key购买 nike

我正在尝试编写一个重载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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com