Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to overload operator == outside template class using friend function?

I'm trying to write a template class which overloads operator==. I know how to get it inside the class:

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

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

But now I want to achieve this outside the template class. I've read this post: error when trying to overload << operator and using friend function and add template declaration in my code:

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)
}

However I still get a error: unresolved external symbol "bool __cdecl operator==(class Point<int>,class Point<int>)" (??8@YA_NV?$Point@H@@0@Z) referenced in function _main

And when I take away friend from :

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

and want it to be member function, there would be a another error:

too many parameters for this function

why?

like image 789
sydridgm Avatar asked Jan 29 '26 14:01

sydridgm


1 Answers

@Kühl's answer is the most permissive approach to declare a templated friend function of a templated class. However, there is one unapparent side effect of this approach: All template instantiations of Point are friends with all template instantiations of operator==(). An alternative is to make only the instantiation with the same type of Point a friend. Which is done by adding a <T> in the friend declaration of 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);
};

References
http://web.mst.edu/~nmjxv3/articles/templates.html

like image 89
mljli Avatar answered Jan 31 '26 02:01

mljli