我正在尝试编写一个重载operator ==的模板类。我知道如何在课堂上使用它:
template <typename T>
class Point
{
private:
T x;
public:
Point(T X) : x(X) {}
bool operator== (Point &cP)
{
return (cP.x == x);
}
};
但是现在我想在模板类之外实现这一点。我读过这篇文章:尝试重载<<运算符并使用好友函数并在我的代码中添加模板声明时出错:
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 bool operator== (Point cP1, Point cP2);
并希望它成为成员函数,将会出现另一个错误:
too many parameters for this function
为什么?
@Kühl的答案是声明模板化类的模板化朋友功能的最宽松的方法。但是,这种方法有一个明显的副作用:的所有模板实例Point
都是具有的所有模板实例的朋友operator==()
。另一种选择是仅使用相同类型的Point
朋友进行实例化。这是通过<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);
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句