On 9/19/07, personaje <[EMAIL PROTECTED]> wrote:
> Buenas gente,
>
> Tengo un problemita, estoy overlodeando el operador == para una clase
> template que tengo, pero cuando lo trato de especializar me tira que
> ya está definido. El código es el siguiente:
>
>
> ------------>B------------>B------------>B------------>B------------>B------------>B------------
> // Operador == para el TPoint
> template <class T1,class T2>
> bool operator==(TPoint<T1> PointA,TPoint<T2> PointB)
> {
>         if(PointA.GetX()==PointB.GetX() && PointA.GetY()==PointB.GetY())
>                 return true;
>         return false;
> }
>
> #define EPSILON 0.000000001
>
> // Operador == para el TPoint especializado en RealPoint
> template <>
> bool operator==(TPoint<double> PointA,TPoint<double> PointB)
> {
>         if ( fabs(PointA.GetX()-PointB.GetX())<EPSILON &&
>                         fabs(PointA.GetY()-PointB.GetY())<EPSILON )
>                 return true;
>         return false;
> }
> ------------8<------------8<------------8<------------8<------------8<------------8<------------
>
> TPoint es un template y tiene los métodos de acceso a X e Y (un punto
> 2D), lo tengo definido para int, y double (y otros, pero para el
> ejemplo alcanza), el problema es que no puedo usar == para double
> (está bien cómo lo hago?)
> Quiero que para cuando haga la comparación entre dos TPoint
> especializados en double me utilize la segunda versión... pero, como
> dije arriba, se me queja que ya se encuentra definido...
>
> qué estoy haciendo mal?
>
> Saludos
>

yo probe el siguiente codigo y compile con gcc sin problemas:


#include <cmath>
#include <iostream>

template<class T>
class TPoint
{
    private:
        T _x, _y;

    public:
        TPoint(T x, T y) {
            _x = x;
            _y = y;
        }
        T GetX() { return _x; }
        T GetY() { return _y; }
};

// Operador == para el TPoint
template <class T1, class T2>
bool operator==(TPoint<T1> PointA, TPoint<T2> PointB)
{
    if (PointA.GetX() == PointB.GetX() && PointA.GetY() == PointB.GetY())
        return true;
    return false;
}

#define EPSILON 0.000000001

// Operador == para el TPoint especializado en RealPoint
template <>
bool operator==(TPoint<double> PointA, TPoint<double> PointB)
{
    if (fabs(PointA.GetX() - PointB.GetX()) < EPSILON &&
        fabs(PointA.GetY() - PointB.GetY()) < EPSILON)
        return true;
    return false;
}

int main()
{
    TPoint<double> pd1(1.2, 3.4);
    TPoint<double> pd2(1.2, 3.4);
    TPoint<double> pd3(3.2, 5.4);
    std::cout << (pd1 == pd2) << std::endl;
    std::cout << (pd1 == pd3) << std::endl;
    TPoint<int> pi1(1, 3);
    TPoint<int> pi2(1, 3);
    TPoint<int> pi3(2, 4);
    std::cout << (pi1 == pi2) << std::endl;
    std::cout << (pi1 == pi3) << std::endl;
    return 0;
}

proba intercambiar el orden de instanciaciones en tu main
TPoint<int> p1;
TPoint<double> p2;

por

TPoint<double> p2;
TPoint<int> p1;


y fijate si tu mensaje de error es el mismo.

slds.
Francisco

_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a